c++ - 如何设置 2 个不同的 FBO 作为片段着色器输出

标签 c++ opengl framebuffer fragment-shader

我正在尝试将片段着色器的结果输出到两个不同的输出(帧缓冲区对象)。

就着色器而言,我了解到我可以将不同的目标指定为:

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);

关于c++ - 如何设置 2 个不同的 FBO 作为片段着色器输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291929/

相关文章:

c++ - Qt:为什么我的图像背景在 LinuxFb 上是绿色的?

iphone - OpenGL ES 2.0 FBO 创建出错并出现未知错误

c++ - 使用 noexcept 运算符链接 noexcept 声明

C++ 结构引用类型

c# - Visual C# 中哪个库用于图形编程,Tao 还是 OpenTK?

LinuxFB + DirectFB 同时?

c++ - std::string::max_size() 作为静态成员

c++ - 一元 '*' 的无效类型参数(具有 'int' )数组中的最低元素

opengl - GLUT死了吗?

c# - OpenGL - 如何创建和绑定(bind)立方体贴图数组?