在研究延迟渲染时发现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);