无法使用8个以上的渲染缓冲区创建FBO

时间:2019-02-11 12:41:49

标签: opengl pyopengl fbo deferred-rendering

所以,这就是问题所在。我有一个FBO,带有8个渲染缓冲区,可以在延迟渲染管道中使用。然后我添加了另一个渲染缓冲区,现在我得到了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,这也可能导致此问题。

我很乐意在此提出任何建议。

1 个答案:

答案 0 :(得分:4)

  

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

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

现在单次需要8个以上的渲染目标似乎还是疯狂

请考虑以下事项:

  • 尽量减少渲染目标的数量,不要存储多余的信息(例如顶点位置),这些信息可以随时轻松地计算出来(您只需要深度,通常无论如何都需要深度附件) )
  • 对数据使用适当的聪明编码,即对法向矢量使用3x float是巨大的浪费。例如,参见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)。但是,您可能可以通过使用预深度遍历完全消除该情况。