欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpengGL帧缓冲中颜色附件纹理无法输出数据

程序员文章站 2024-03-25 23:34:16
...

在研究延迟渲染时发现G缓冲输出的纹理图像没有任何数据,显示为全黑。
经过漫长的摸索终于找到原因,居然是因为开启了混合,解决办法也很简单,在渲染G缓冲之前调用一下glDisable(GL_BLEND)就可以了。
如果必须要启用混合也是可以的,只需要注意创建纹理的时候采用RGBA格式,而非RGB:
错误:glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
正确:glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
此外还需要在shader中指定为vec4而非vec3:
错误:layout (location = 0) out vec3 gPosition;
正确:layout (location = 0) out vec4 gPosition;
并且如果w分量为0也不会输出任何数据。

此外还需值得注意的是,绑定的位置不能与其它纹理缓冲冲突,否则会产生奇怪的效果。
例如G缓冲纹理已经占用0、1、2:

layout (location = 0) out vec4 gPosition;
layout (location = 1) out vec3 gNormal;
layout (location = 2) out vec4 gAlbedoSpec;

此时又将另一个纹理缓冲绑定到同一个shader中的0位置将发生冲突:

glBindImageTexture(0, mImageTexture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F);