如何将 GL_TEXTURE_2D_ARRAY 绑定到 GL_COLOR_ATTACHMENT1 上的帧缓冲区?
How to bind a GL_TEXTURE_2D_ARRAY to a framebuffer on GL_COLOR_ATTACHMENT1?
编辑:查看@Rabbid76 的回答,问题与 GL_TEXTURE_2D_ARRAY 没有真正相关,仅与帧缓冲区颜色附件激活有关!
我在将用于输出到单个纹理的着色器更新为多个纹理时遇到问题。
这是简化的代码,我会把我发现的所有相关内容都放在一起,如果代码的其他部分很重要,请随时询问。
glGenTexture(1, tex);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA32F, x, y, 2);
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, tex, 0, 1);
碎片着色器写入:
#version 330
layout(location = 0) out vec4 col1;
layout(location = 1) out vec4 col2;
int main()
{
col1 = vec4(1.0);
col2 = vec4(2.0);
}
使用该结果的其他着色器:
#version 330 core
uniform sampler2DArray tex;
in vec2 Coord;
int main()
{
vec4 val = texture(tex, vec3(Coord, 0));
val += texture(tex, vec3(Coord, 1));
}
问题是col1
在layout 0
里面写的很好(不考虑纹理层,glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texDefo, 0, 1);
也可以),但是我不会在[=里面写18=](GL_COLOR_ATTACHMENT1
)。
我在这里遗漏了什么吗?
大量测试:
从我可以缩小的范围来看,layout(location = 1)
确实不像我预期的那样工作。使用提供的代码,我得到
- val = col1 当
layout(location = 0) out vec4 col1;
- val = col2 当
layout(location = 0) out vec4 col2;
不管我绑定了哪个纹理层 GL_COLOR_ATTACHMENTi
,即两个层似乎都在 GL_TEXTURE_2D_ARRAY
. 中工作
您需要使用 glDrawBuffers
:
指定要绘制到的缓冲区
GLenum drawBuffers[]{ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, drawBuffers);
编辑:查看@Rabbid76 的回答,问题与 GL_TEXTURE_2D_ARRAY 没有真正相关,仅与帧缓冲区颜色附件激活有关!
我在将用于输出到单个纹理的着色器更新为多个纹理时遇到问题。 这是简化的代码,我会把我发现的所有相关内容都放在一起,如果代码的其他部分很重要,请随时询问。
glGenTexture(1, tex);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA32F, x, y, 2);
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, tex, 0, 1);
碎片着色器写入:
#version 330
layout(location = 0) out vec4 col1;
layout(location = 1) out vec4 col2;
int main()
{
col1 = vec4(1.0);
col2 = vec4(2.0);
}
使用该结果的其他着色器:
#version 330 core
uniform sampler2DArray tex;
in vec2 Coord;
int main()
{
vec4 val = texture(tex, vec3(Coord, 0));
val += texture(tex, vec3(Coord, 1));
}
问题是col1
在layout 0
里面写的很好(不考虑纹理层,glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texDefo, 0, 1);
也可以),但是我不会在[=里面写18=](GL_COLOR_ATTACHMENT1
)。
我在这里遗漏了什么吗?
大量测试:
从我可以缩小的范围来看,layout(location = 1)
确实不像我预期的那样工作。使用提供的代码,我得到
- val = col1 当
layout(location = 0) out vec4 col1;
- val = col2 当
layout(location = 0) out vec4 col2;
不管我绑定了哪个纹理层GL_COLOR_ATTACHMENTi
,即两个层似乎都在GL_TEXTURE_2D_ARRAY
. 中工作
您需要使用 glDrawBuffers
:
GLenum drawBuffers[]{ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, drawBuffers);