有没有办法强制OpenGL标识符从一个而不是零开始?

时间:2013-03-16 16:03:23

标签: c++ opengl coding-style null indexing

我将OpenGL标识符存储在GLuint类型的变量中。但我不知道我应该初始化这些变量的价值。我想将它们初始化为零,但不幸的是,这是OpenGL的有效标识符。

必须在存储OpenGL对象之前初始化变量,因为这是稍后异步完成的。那么我能以某种方式强制OpenGL开始用一个而不是零开始索引吗?或者我应该使用GLint并初始化为-1

我想以干净的方式解决这个问题。当然,我可以存储一对变量和一个布尔标志或类似的东西。但那将是hacky。你如何处理这个问题?

2 个答案:

答案 0 :(得分:6)

  

我想将它们初始化为零,但不幸的是,这是OpenGL的有效标识符。

不,不是。 0 means "not an object" for most OpenGL object types。唯一拥有有效0对象的是FBO(其中0表示Default Framebuffer),转换反馈对象和纹理(您应该将视为它们不是对象)。

所以只需使用零。使用零调用任何glDelete*是合法的,即使0是该类型的有效对象,也不会发生任何事情。

答案 1 :(得分:2)

  

当然我可以存储一对变量和一个布尔标志或类似的东西。但那将是hacky。你如何处理这个问题?

使用boost::optional,这是您所描述内容的基于模板的实现。 See here.

你可以这样做:

boost::optional<GLuint> foo; // Uninitialised
if (foo) // foo evaluates to false
{
    Bar(*foo); // Doesn't execute
} 
*foo = 3; // Initialised
if (foo) // foo evaluates to true
{
    Bar(*foo); // Executes
}