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);

&lt;attach&gt; 是前三个连接点。

【讨论】:

在粘贴到 SO 时试图使示例代码更简洁,这对我不利,我已经在这样做了。我更新了帖子。【参考方案2】:

更改为layout(location = 3) out vec4 gEntityID; 并将具有 alpha 1.0 的 vec4 和单通道值分配给红色组件似乎已经完成了。

【讨论】:

以上是关于OpenGL - 渲染到单通道纹理?的主要内容,如果未能解决你的问题,请参考以下文章

使用单通道纹理(OpenGL 2)?

OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

OpenGL透明纹理问题

OpenGL:禁用纹理颜色?

OpenGL纹理组合不(总是)工作

OpenGL 渲染到纹理 - 黑屏