无法创建具有超过 8 个渲染缓冲区的 FBO

Can't create FBO with more than 8 render buffers

所以,问题来了。我有一个带有 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 这也可能导致这个问题。

此时我很乐意提供任何建议。

It looks more like some kind of OpenGL limitation that I don't know about.

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

无论如何,现在单次渲染需要超过 8 个渲染目标 疯狂

考虑以下事项:

  • 尽量减少渲染目标的数量,不要存储冗余信息(例如顶点位置),这些信息很容易在运行时计算(你只需要单独的深度,而且你通常有一个深度附件)
  • 使用适合数据的巧妙编码,即法向量的 3xfloat 是一种巨大的浪费。例如参见 [​​=21=]
  • 合并不同的渲染目标。即,如果您需要一个 vec3 和 2 个 vec2 输出,最好使用 2 个 vec4 目标并将 8 个值分配给 8 个通道
  • 甚至可以使用更高的位深度格式,如 RGBA32UI 并手动将不同的值编码到单个通道中

如果您仍然需要更多数据,您可以执行多个渲染通道(基本上每个通道有 n/8 个目标)。另一种选择是使用 image load/store or SSBOs in your fragment shader to write the additional data. In your Scenario, using image load/store seems to make most sense, soince you probaly need the resulting data as texture. You also get a relatively good access pattern, since you can basically use gl_FragCoord.xy for adressing the image. However, care must be taken if you have overlapping geometry in one draw call, so that you write to each pixel more than once (that issue is also addressed by the GL_ARB_fragment_shader_interlock extension,但这还不是 OpenGL 的核心功能)。但是,您 可能 能够通过使用预深度通道完全消除这种情况。