在constexpr GLenum数组中存储OpenGL颜色附件

时间:2017-12-28 23:53:08

标签: c++ c++11 opengl

我使用以下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,有或没有预处理器宏?

1 个答案:

答案 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函数来生成这样的值。