OpenGL - 渲染到单通道纹理?

时间:2021-01-04 04:02:10

标签: c++ opengl glsl

我正在尝试渲染到附加到帧缓冲区的单通道纹理,但它不起作用。我使用大小格式创建纹理:

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 使用情况吗?

2 个答案:

答案 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 似乎已经完成了。