我正在尝试渲染到附加到帧缓冲区的单通道纹理,但它不起作用。我使用大小格式创建纹理:
glCreateTextures(GL_TEXTURE_2D, 1, &entityTexture);
glTextureStorage2D(entityTexture, 1, GL_R32F, viewport.size.x, viewport.size.y);
glTextureParameteri(entityTexture, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTextureParameteri(entityTexture, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
更新:然后我将它与其他一些人一起附加到我的帧缓冲区:
std::array<GLenum, 4> colorAttachments = {
GL_COLOR_ATTACHMENT0,
GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2,
GL_COLOR_ATTACHMENT3,
};
glNamedFramebufferDrawBuffers(GBuffer, static_cast<GLsizei>(colorAttachments.size()), colorAttachments.data());
在着色器内部我写在上面:
layout(location = 0) out vec4 gNormal;
layout(location = 1) out vec4 gColor;
layout(location = 2) out vec4 gMetallicRoughness;
layout(location = 3) out float gEntityID;
然后在片段着色器中向其写入一些随机测试值(绘制一堆网格):
gEntityID = 12.3;
当我检查 RenderDoc 时,图像变成黑色,值为 0。所有这些都检查 API 使用情况吗?
答案 0 :(得分:1)
这与渲染到单通道纹理无关。您将颜色输出路由到缓冲区的代码不起作用。
<块引用>glNamedFramebufferDrawBuffers(GBuffer, 1, GL_COLOR_ATTACHMENT3);
那不是how glDrawBuffers
or its DSA equivalent work。确实,您应该得到一个编译错误,因为您试图将一个纯右值整数文字 (GL_COLOR_ATTACHMENT3
) 传递给一个带有指针的函数。
即使我们修复了您的函数以使其传递单元素数组:
GLenum attachments[1] = {GL_COLOR_ATTACHMENT3};
glNamedFramebufferDrawBuffers(GBuffer, 1, attachments);
那还是不行。
您传递 glDrawBuffers
一个数组。该数组的索引是您在片段着色器中设置的颜色编号。因此,片段着色器输出上的 location = 3
意味着查看传递给 glDrawBuffers
的数组的第 4 个元素,以确定使用了哪个附件绑定点。您只传递了一个元素,因为您提供的大小为 1。数组的其他元素设置为 GL_NONE
。
所以什么都没有写入。
你(也许?)想要的是:
GLenum attachments[4] = {<attach>, <attach>, <attach>, GL_COLOR_ATTACHMENT3};
glNamedFramebufferDrawBuffers(GBuffer, 4, attachments);
其中 <attach>
是前三个附着点。
答案 1 :(得分:0)
更改为 layout(location = 3) out vec4 gEntityID;
并为红色组件分配一个 alpha 1.0 和单通道值的 vec4 似乎已经完成了。