OpenGL - 渲染到单通道纹理?
Posted
技术标签:
【中文标题】OpenGL - 渲染到单通道纹理?【英文标题】:OpenGL - Render to single channel texture? 【发布时间】:2021-01-04 04:02:10 【问题描述】:我正在尝试渲染附加到帧缓冲区的单通道纹理,但它不起作用。我使用大小格式创建纹理:
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 使用情况吗?
【问题讨论】:
【参考方案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>
是前三个连接点。
【讨论】:
在粘贴到 SO 时试图使示例代码更简洁,这对我不利,我已经在这样做了。我更新了帖子。【参考方案2】:更改为layout(location = 3) out vec4 gEntityID;
并将具有 alpha 1.0 的 vec4 和单通道值分配给红色组件似乎已经完成了。
【讨论】:
以上是关于OpenGL - 渲染到单通道纹理?的主要内容,如果未能解决你的问题,请参考以下文章