c++ - 如何将 GL_TEXTURE_2D_ARRAY 绑定到 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);
也可以),但我不会写layout 1
(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);
推荐阅读
- vb.net - 这些 VB.NET 方法是否更快:SaveSetting() 或 SetValue()?
- svg - SVG:用三种颜色填充矩形的最佳方法
- python - Lambda 函数进行 athena 查询,查询结果不在 S3 输出存储桶中
- java - @Repository 接口的Spring功能bean注册
- javascript - 将rest api数据导入引导Vue表和分页
- yaml - 用于 eks 负载均衡器的 https
- javascript - 自定义 jQuery 滚动效果
- azure - 在 azure 数据工厂复制活动后获取文件列表
- css - 使用 % 会导致换行,但使用 px 可以正常工作
- python - 涉及外部日志配置文件时服务无法启动