使用制服时,Xamarin OpenGL片段着色器出现奇怪的行为

时间:2016-09-01 09:07:10

标签: ios xamarin opengl-es fragment-shader

我目前正在处理的片段着色器有一些非常奇怪的行为让我疯狂。我有一个帧缓冲对象,我正在渲染。在片段着色器中,我也使用我自己编写的' texelFetch'来自相同的纹理。 (默认情况下我没有使用OpenGL ES):

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

注意:中心图像略微旋转,但这是由于我错误地截屏。

1 个答案:

答案 0 :(得分:0)

根据@ Isogen74提供的信息,我得出结论,它可能确实是某个地方的GPU堆栈中的错误。因此,我决定寻找一种解决方法并更新到opengl es 3.0。 texelFetch已在那里实施,无需纹理的尺寸。现在它就像一个魅力!感谢所有的帮助=)!真的很感激!