所以,这里的问题。 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的限制,我不知道。
相关的限制是GL_MAX_COLOR_ATTACHMENTS
和规范保证这个值至少8
。
现在需要超过8个渲染目标在一个单一的通似乎疯了呢。
考虑下面的事情:
float
用于正常矢量是一个巨大的浪费。例如,见Survey of Efficient Representations for Independent Unit Vectorsvec3
和2个vec2
输出,更好地利用2 vec4
目标和asiign的8个值的8个通道RGBA32UI
并手动编码不同的值成一个单一信道如果您还需要更多的数据,你要么可以做几个渲染通道(基本上与每个通n/8
目标)。另一种方法是使用image load/store或SSBOs在片段着色器写入附加数据。在方案中,使用图像加载/存储似乎使最有意义,soince你probaly需要的结果数据,作为质感。您还可以得到一个比较好的访问模式,因为你基本上可以使用gl_FragCoord.xy
为adressing图像。但是,如果你有一个绘制调用重叠的几何形状,让你写的每一个像素不止一次(该问题也由GL_ARB_fragment_shader_interlock
extension解决,但一个是尚未的OpenGL的核心功能)必须小心。但是,您可能能够通过使用前深度通完全排除这样的情况。