不能与创建FBO超过8渲染缓冲区

问题描述 投票:2回答:1

所以,这里的问题。 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个回答
4
投票

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

相关的限制是GL_MAX_COLOR_ATTACHMENTS和规范保证这个值至少8

现在需要超过8个渲染目标在一个单一的通似乎疯了呢。

考虑下面的事情:

  • 尽量减少渲染目标数目尽可能地,不存储冗余信息(如顶点位置),它可以很容易地在运行时被计算(你只需要深度孤独,你通常有一个深度附件反正)
  • 使用巧妙编码适合于数据,即3xfloat用于正常矢量是一个巨大的浪费。例如,见Survey of Efficient Representations for Independent Unit Vectors
  • 合并不同的渲染目标。即如果你需要一个vec3和2个vec2输出,更好地利用2 vec4目标和asiign的8个值的8个通道
  • 甚至用较高的位深度格式,如RGBA32UI并手动编码不同的值成一个单一信道

如果您还需要更多的数据,你要么可以做几个渲染通道(基本上与每个通n/8目标)。另一种方法是使用image load/storeSSBOs在片段着色器写入附加数据。在方案中,使用图像加载/存储似乎使最有意义,soince你probaly需要的结果数据,作为质感。您还可以得到一个比较好的访问模式,因为你基本上可以使用gl_FragCoord.xy为adressing图像。但是,如果你有一个绘制调用重叠的几何形状,让你写的每一个像素不止一次(该问题也由GL_ARB_fragment_shader_interlock extension解决,但一个是尚未的OpenGL的核心功能)必须小心。但是,您可能能够通过使用前深度通完全排除这样的情况。

© www.soinside.com 2019 - 2024. All rights reserved.