【问题标题】:How to bind a GL_TEXTURE_2D_ARRAY to a framebuffer on GL_COLOR_ATTACHMENT1?如何将 GL_TEXTURE_2D_ARRAY 绑定到 GL_COLOR_ATTACHMENT1 上的帧缓冲区?
【发布时间】:2021-08-12 12:30:42
【问题描述】:

编辑:请参阅@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));
}

问题是col1layout 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中工作。

【问题讨论】:

    标签: c++ opengl glsl shader


    【解决方案1】:

    您需要使用glDrawBuffers 指定要绘制的缓冲区:

    GLenum drawBuffers[]{ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
    glDrawBuffers(2, drawBuffers);
    

    【讨论】:

    • 谢谢!关于openGL,我还有很多东西需要学习,所以很抱歉,这看起来像是一个新手错误……这是否仅适用于绑定帧缓冲区或所有帧缓冲区/图形管道?编辑:从void glNamedFramebufferDrawBuffers() 的存在来看,它应该只适用于当前绑定的帧缓冲区!
    • @startresse 来自 wiki 页面 (glDrawBuffers):“对于 glDrawBuffers,将使用绑定到 GL_DRAW_FRAMEBUFFER 绑定的帧缓冲区对象”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多