1

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

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

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

4

2 回答 2

6

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

不,不是。对于大多数 OpenGL 对象类型,0 表示“不是对象”。唯一具有有效 0 对象的是 FBO(其中 0 表示默认帧缓冲区)、变换反馈对象和纹理(您应该将它们视为不是对象)。

So just use zero. It's legal to call any glDelete* with a zero, and nothing will happen, even if 0 is a valid object for that type.

于 2013-03-16T16:33:51.067 回答
2

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

使用boost::optional,这是您所描述的基于模板的实现。看这里。

有了它,你可以做这样的事情:

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
}
于 2013-03-16T16:05:04.537 回答