我使用以下constexpr GLenum数组来表示GL_COLOR_ATTACHMENTx
(其中x是0到7之间的无符号整数):
constexpr std::array<GLenum, 8> opengl_color_attachment{GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT7};
这仅适用于前八个可用颜色附件(OpenGL规范规定的最小颜色附件)。但是,有可能存在更多附件,这是实现定义的。由于宏GL_MAX_COLOR_ATTACHMENTS
表示可用附件的数量,我想编辑此constexpr数组以包括限制的所有可用附件,而不是最小值8。
我创建了以下宏以尝试自己解决此问题:
#define OPENGL_COLOR_ATTACHMENT(x) GL_COLOR_ATTACHMENT##x
虽然我想在constexpr函数中使用它来在编译时创建数组,但它失败了,因为在编译之前显然处理了预处理器宏。虽然OpenGL标准保证GL_TEXTURE1 == GL_TEXTURE0 + 1
,但我找不到这个宏的引用,所以我不确定它们在这种情况下是否是顺序的。
有没有办法让我从GL_COLOR_ATTACHMENT0到GL_COLOR_ATTACHMENTx完全创建constexpr数组,其中x = GL_MAX_COLOR_ATTACHMENTS,有或没有预处理器宏?
答案 0 :(得分:3)
已经确定you cannot effectively use more than 32 attachments,因为glFramebufferTexture
除了枚举者之外不接受任何其他内容。 GL_COLOR_ATTACHMENT0 + 32
恰好等于GL_DEPTH_ATTACHMENT
,所以很明显,实现无法区分使用纹理作为第33种颜色附件和深度附件。它将假设后者。
所以真的,只需制作一个包含32个附件的数组并继续前进。或者只使用GL_COLOR_ATTACHMENT0 + i
,其中i
小于32.规范中的枚举数确实是顺序的;只是,与纹理单元枚举不同,没有人留下任何超过32的空间。如果需要,你甚至可以创建一个constexpr
函数来生成这样的值。