如何将Renderbuffer / textures分配给正确的片段着色器输出?

时间:2014-08-03 08:01:04

标签: c++ opengl framebuffer

此代码段属于初始化函数,来自OpenGL Programming Guide V4.3,第188页:

enum {Color, Depth, NumRenderbuffers };
GLuint framebuffer, renderbuffer[NumRenderbuffers]

void init()
{
    glGenRenderbuffers(NumRenderbuffers, renderbuffer);

    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Color]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 256,256);

    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Depth]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256,256);

    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer[Color]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer[Depth]);

    glEnable(GL_DEPTH_TEST);
}

我如何将片段着色器输出定向到正确的渲染缓冲区?

我知道我们应该使用这样的东西:

layout (location = 0) out vec4 color;
layout (location = 1) out float depth;

但是,我不明白一些事情:

问题1:上述行中的0和1究竟是什么?它们是相应渲染缓冲区/纹理的GLuint吗?

问题2:这些0和1是否与FBO的GL_COLOR_ATTACHMENTX目标有关?通常情况下,我看到人们使用layout (location = x)和相应的GL_COLOR_ATTACHMENTX,但如果您还有一个具有附件GL_DEPTH_ATTACHMENT的深度纹理,您会怎么做?它得到了什么layout (location = x)?通常情况下,我看到人们设置layout (location = 0) out float depth或某些变体,而在帧缓冲初始化中绝对没有任何东西可以证明0的合理性。

问题2:由于GLUints在初始化期间由OpenGL分配,并且可能会根据您在它们之前初始化的内容而改变,因此在着色器中确定渲染缓冲区的GLuint的安全方法是什么(放入正确的{{1行)?

问题3:我有一个简单的阴影贴图实现,深度纹理绑定到帧缓冲区,例如。它是其FBO的唯一附件,我将其附加到layout (location = x)行。在尝试理解这种glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_shadowMap, 0);情况时,我已将片段着色器设置为使用“未使用”的位置编号,例如layout,并且还简单地将布局部分注释掉,只留下{{1} }。这两个变化都没有做任何事:阴影贴图仍然完美地创建/使用。为什么呢?

0 个答案:

没有答案