2016-09-01 3 views
0

Фрагментный шейдер, над которым я сейчас работаю, имеет довольно странное поведение, которое сводит меня с ума. У меня есть объект буфера кадров, который я просматриваю. В пиксельный шейдер я также прочитал из одной и той же текстуры, используя свой собственный письменный «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); 

Может кто-нибудь увидеть, что я делаю неправильно? Любая помощь очень ценится

Different rendered images

Примечание: центр изображения слегка поворачивается, но это из-за меня делает скриншот неправильно.

+0

Что такое «правильный результат» и что такое «неправильный результат»? Вы конвертируете из float в int много, в зависимости от точности по умолчанию это может «компенсировать» вещи –

+0

Спасибо за ваш ответ! Я включил изображения в сообщение и сделал более низкий блок кода более явным. Насколько я вижу, это связано не с преобразованиями. Я только делаю конверсию один раз, и Ive пытался сыграть с: -Используемый highp для всех значений -изменяет атрибут на 'GL.Uniform2 (screenImageSizeUniform, 1440.5f, 900.5f);' Оба эффекта, похоже, не имеют эффекта –

+0

Вы читаете и записываете одну и ту же текстуру? – solidpixel

ответ

0

Основываясь на информации, предоставленной @ Isogen74, я пришел к выводу, что это может быть ошибка в стеке GPU. Поэтому я решил найти обходное решение и обновить opengl es 3.0. texelFetch был реализован там, не требуя размеров текстуры. Теперь это работает как шарм! Спасибо за помощь =)! Его действительно оценили!

 Смежные вопросы

  • Нет связанных вопросов^_^