【问题标题】:Can't create FBO with more than 8 render buffers无法创建超过 8 个渲染缓冲区的 FBO
【发布时间】:2019-02-11 12:41:49
【问题描述】:

所以,这就是问题所在。我有一个带有 8 个渲染缓冲区的 FBO,我在延迟渲染管道中使用它们。然后我添加了另一个渲染缓冲区,现在我得到了一个 GLError。

GLError(
err = 1282,
description = b'invalid operation',
baseOperation = glFramebufferTexture2D,
cArguments = (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, 12, 0,)

代码应该没问题,因为我刚刚从之前使用的渲染缓冲区中复制了它。

glMyRenderBuffer = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, glMyRenderBuffer)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, self.width, self.height, 0, GL_RGB, GL_FLOAT, None)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, glMyRenderBuffer, 0)
glGenerateMipmap(GL_TEXTURE_2D)

我在这一行得到错误

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, glMyRenderBuffer, 0)

它看起来更像是某种我不知道的 OpenGL 限制。

我也有一个奇怪的堆栈 - Linux + GLFW + PyOpenGL 这也可能导致这个问题。

我很乐意在这一点上提出任何建议。

【问题讨论】:

    标签: opengl pyopengl fbo deferred-rendering


    【解决方案1】:

    它看起来更像是某种我不知道的 OpenGL 限制。

    相关限制为GL_MAX_COLOR_ATTACHMENTS,规范保证此值至少为8

    现在单次需要超过 8 个渲染目标似乎疯狂

    考虑以下几点:

    • 尽量减少渲染目标的数量,不要存储可以轻松计算的冗余信息(如顶点位置)(你只需要深度,而且你通常有一个深度附件) )
    • 使用适合数据的巧妙编码,即 3xfloat 用于法线向量是一种巨大的浪费。参见例如Survey of Efficient Representations for Independent Unit Vectors
    • 合并不同的渲染目标。即如果您需要一个vec3 和2 个vec2 输出,最好使用2 个vec4 目标并将8 个值分配给8 个通道
    • 甚至可以使用更高位深度的格式,例如 RGBA32UI,并手动将不同的值编码到单个通道中

    如果您仍需要更多数据,您可以执行多个渲染通道(基本上每个通道使用n/8 目标)。另一种选择是在片段着色器中使用image load/storeSSBOs 来写入附加数据。在您的场景中,使用图像加载/存储似乎最有意义,因为您可能需要将结果数据作为纹理。您还可以获得相对较好的访问模式,因为您基本上可以使用gl_FragCoord.xy 来处理图像。但是,如果您在一次绘制调用中有重叠的几何图形,则必须小心,以便您多次写入每个像素(GL_ARB_fragment_shader_interlock extension 也解决了该问题,但该问题还不是 OpenGL 的核心功能) .但是,您可能可以通过使用预深度通道完全消除这种情况。

    【讨论】:

    • >现在单次需要超过 8 个渲染目标似乎很疯狂。这并不是真的疯了。我正在做一些科学的可视化,有很多额外的数据,比如分割和东西,恐怕我无法真正避免它。但无论如何,谢谢,我只是想确定这个限制是不能避免的。我将开始研究这种优化,并且可能会重新安排我的管道。
    • 好吧,在 GL 做出的保证(以及大多数 GPU 的实际硬件限制)内,您最多可以获得 8 个具有 4x32Bit 通道的渲染目标。如果您无法将数据放入其中,则需要进行多次渲染。构建一个动态系统巫婆将n 渲染目标适合n/8 传递不会太难,问题更像是您的场景仍然可以容忍什么样的性能水平......
    • 我已经更新了我的答案,还提到了使用图像加载/存储的替代方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多