如何设置 2 个不同的 FBO 作为片段着色器输出
How to set up 2 different FBOs as fragment shader outputs
我正在尝试将片段着色器的结果输出到两个不同的输出(帧缓冲区对象)。
就着色器而言,我了解到我可以将不同的目标指定为:
layout (location = x) out vec4 color;
layout (location = y) out vec4 miscData;
现在的问题是:如何在 C++ 端指定这些位置?以便我的两个 FBO 匹配着色器的输出索引?我在 Nicol Bolas 的书中有一个关于顶点着色器的示例,但对片段着色器部分的阅读还不够多 - 所以我不知道他是否涵盖了这个主题。
正如另一个琐事问题:我已经阅读了纹理索引 are at least 48(TEXTURE0、TEXTURE1 等...),即使在最极端的图形应用程序中也不会超过这个。怎么会 ?是因为您通常不会在片段着色器中同时使用超过 48 个纹理吗?我一定遗漏了一些非常明显的东西,因为很明显,现代游戏使用了数百种不同的纹理。
最后,纹理索引(TEXTURE0、TEXTURE1、...)与布局位置有什么关系吗?
您的帧缓冲区中应该有多个颜色附件,然后设置绘制缓冲区,如下所示:
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texID0, 0);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, texID1, 0);
GLuint drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);
我正在尝试将片段着色器的结果输出到两个不同的输出(帧缓冲区对象)。
就着色器而言,我了解到我可以将不同的目标指定为:
layout (location = x) out vec4 color;
layout (location = y) out vec4 miscData;
现在的问题是:如何在 C++ 端指定这些位置?以便我的两个 FBO 匹配着色器的输出索引?我在 Nicol Bolas 的书中有一个关于顶点着色器的示例,但对片段着色器部分的阅读还不够多 - 所以我不知道他是否涵盖了这个主题。
正如另一个琐事问题:我已经阅读了纹理索引 are at least 48(TEXTURE0、TEXTURE1 等...),即使在最极端的图形应用程序中也不会超过这个。怎么会 ?是因为您通常不会在片段着色器中同时使用超过 48 个纹理吗?我一定遗漏了一些非常明显的东西,因为很明显,现代游戏使用了数百种不同的纹理。
最后,纹理索引(TEXTURE0、TEXTURE1、...)与布局位置有什么关系吗?
您的帧缓冲区中应该有多个颜色附件,然后设置绘制缓冲区,如下所示:
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texID0, 0);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, texID1, 0);
GLuint drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);