Фрагментный шейдер, над которым я сейчас работаю, имеет довольно странное поведение, которое сводит меня с ума. У меня есть объект буфера кадров, который я просматриваю. В пиксельный шейдер я также прочитал из одной и той же текстуры, используя свой собственный письменный «texelFetch» (который реализуется не по умолчанию, как я использую OpenGL ES):Xamarin OpenGL фрагмент шейдера странное поведение при работе с униформами
vec4 texelFetch(sampler2D tex, ivec2 size, ivec2 coord)
{
vec2 texCoord= vec2((2.0*float(coord.x) + 1.0)/(2.0*float(size.x)), (2.0*float(coord.y) + 1.0)/(2.0*float(size.y)));
return texture2D(tex, texCoord);
}
Это означает, что я также необходимо знать размер текстуры, которую я обрабатываю, когда я вызывал эту функцию. Размер текстуры 1440x900, которая представлена в форме в моем шейдера:
uniform vec2 screenImageSize;
я установить это значение в моей программе следующим образом:
if (imageProgram != null)
imageProgram.Use();
screenImageSizeUniform = imageProgram.GetUniformIndex("screenImageSize");
GL.Uniform2(screenImageSizeUniform, 1440.0f, 900.0f);
// Draw triangles that represents frame buffer rectangle
GL.DrawArrays(BeginMode.Triangles, 0, 6);
странно то, что я не получайте правильные выходы, когда я использую эту униформу. Я получаю правильный вывод, когда я жестко кодирую значения. Кроме того, если я выполнить проверку, чтобы увидеть, что значения, я вижу, что равномерная установлен правильно:
//Following line does not give me the correct result as it seems to shift pixel values
//ivec2 test=ivec2(int(screenImageSize.x),int(screenImageSize.y));
//Following line does give me the correct result
ivec2 test=ivec2(1440,900);
if(test.x==1440 && test.y==900)
gl_FragColor=texelFetch(previousFullImage,test,ivec2(gl_FragCoord.x,gl_FragCoord.y));
else
gl_FragColor=vec4(1.0,0.0,0.0,1.0);
Может кто-нибудь увидеть, что я делаю неправильно? Любая помощь очень ценится
Примечание: центр изображения слегка поворачивается, но это из-за меня делает скриншот неправильно.
Что такое «правильный результат» и что такое «неправильный результат»? Вы конвертируете из float в int много, в зависимости от точности по умолчанию это может «компенсировать» вещи –
Спасибо за ваш ответ! Я включил изображения в сообщение и сделал более низкий блок кода более явным. Насколько я вижу, это связано не с преобразованиями. Я только делаю конверсию один раз, и Ive пытался сыграть с: -Используемый highp для всех значений -изменяет атрибут на 'GL.Uniform2 (screenImageSizeUniform, 1440.5f, 900.5f);' Оба эффекта, похоже, не имеют эффекта –
Вы читаете и записываете одну и ту же текстуру? – solidpixel