0

对于纹理的屏幕外渲染,我在附件 GL_COLOR_ATTACHMENT0 处附加了一个由定义的纹理

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_FLOAT,NULL);

然后我使用输出 vec4 的片段着色器渲染到 FBO,所以通常情况下应该没问题。为了检查我是否正确显示纹理,我使用了函数

glTexSubImage2D()

在纹理中间添加一些灰色像素。纹理正确显示(我可以在正确的位置完美地看到这些像素),但纹理的其余部分只是嘈杂的伪影(当它不是黑色时)。

这是因为我将 GL_FLOAT 用于 GL_RGBA 纹理吗?如果是,我如何在 GLSL 中将 uvec4 转换为 vec4?我的主着色器的输出是 vec4,我不知道如何将 usampler2D 纹理的 uvec4 输出转换为我的最终 vec4。

感谢您提供的任何答案:)

编辑:我找到了解决方案:我没有清除我的 2 个渲染之间的 GL_COLOR_BUFFER_BIT。

4

1 回答 1

3

我知道这个问题是自我回答的,但需要对此进行讨论:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_FLOAT,NULL);

这不会创建浮点纹理。它创建一个包含归一化无符号整数的纹理。

纹理的实际格式是第三个参数;它定义了纹理实际包含的内容。最后三个参数定义了如何尝试将数据上传到纹理;如果指针为 NULL(并且没有绑定 PBO),则参数没有任何意义

于 2011-07-27T18:56:12.023 回答