Xamarin OpenGL 片段着色器在使用制服时出现奇怪的行为
Xamarin OpenGL fragment shader weird behaviour when working with uniforms
我目前正在处理的片段着色器有一些非常奇怪的行为,这让我抓狂。我有一个正在渲染的帧缓冲区对象。在片段着色器中,我还使用自己编写的 '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);
谁能看出我做错了什么?非常感谢任何帮助
注意:中间的图片有轻微的旋转,这是我截图错误造成的。
根据@Isogen74 提供的信息,我断定它可能确实是某处 GPU 堆栈中的错误。因此,我决定寻找解决方法并更新到 opengl es 3.0。 texelFetch
已经在那里实现,不需要纹理的尺寸。现在它就像一个魅力!感谢所有的帮助=)!非常感谢!
我目前正在处理的片段着色器有一些非常奇怪的行为,这让我抓狂。我有一个正在渲染的帧缓冲区对象。在片段着色器中,我还使用自己编写的 '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);
谁能看出我做错了什么?非常感谢任何帮助
注意:中间的图片有轻微的旋转,这是我截图错误造成的。
根据@Isogen74 提供的信息,我断定它可能确实是某处 GPU 堆栈中的错误。因此,我决定寻找解决方法并更新到 opengl es 3.0。 texelFetch
已经在那里实现,不需要纹理的尺寸。现在它就像一个魅力!感谢所有的帮助=)!非常感谢!