对于纹理的屏幕外渲染,我在附件GL_COLOR_ATTACHMENT0附加了由
定义的纹理glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_FLOAT,NULL);
然后我使用片段着色器渲染到FBO,输出vec4,所以通常情况下应该没问题。要检查我是否正确显示纹理,我使用函数
glTexSubImage2D()
在纹理中间添加一些灰色像素。正确显示纹理(我可以在正确的位置完美地看到这些像素),但纹理的其余部分只是嘈杂的伪像(当它不是黑色时)。
这是否来自我使用GL_FLOAT作为GL_RGBA纹理的事实?如果是的话,我怎样才能在GLSL中将uvec4转换为vec4?我的主着色器的输出是vec4,我不知道如何将usampler2D纹理的uvec4输出转换为我的最终vec4。
感谢您提供的任何答案:)
编辑:我找到了解决方案:我没有清除我的2个渲染之间的GL_COLOR_BUFFER_BIT。
答案 0 :(得分:3)
我知道这个问题是自我回答的,但需要就此进行讨论:
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_FLOAT,NULL);
不创建浮点纹理。它创建一个包含规范化无符号整数的纹理。
actual format of a texture是第三个参数;它定义了纹理实际包含的内容。最后三个参数定义了您尝试upload data to the texture的方式;如果指针为NULL(并且没有绑定PBO),那么参数意味着 nothing 。