繁体   English   中英

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已在此处实现,而无需纹理的尺寸。 现在它就像一种魅力! 感谢您提供的所有帮助=)! 非常感谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM