此代码段属于初始化函数,来自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} }。这两个变化都没有做任何事:阴影贴图仍然完美地创建/使用。为什么呢?