我将 OpenGL 标识符存储在类型的变量中GLuint
。但我不知道我应该将这些变量初始化为什么值。我想将它们初始化为零,但不幸的是,这是 OpenGL 的有效标识符。
必须在存储 OpenGL 对象之前初始化变量,因为这是稍后异步完成的。那么我可以以某种方式强制 OpenGL 以 1 而不是 0 开始索引吗?或者我应该使用GLint
并初始化为-1
?
我想以一种干净的方式解决这个问题。当然,我可以存储一对变量和一个布尔标志或类似的东西。但这将是hacky。你如何看待这个问题?
我将 OpenGL 标识符存储在类型的变量中GLuint
。但我不知道我应该将这些变量初始化为什么值。我想将它们初始化为零,但不幸的是,这是 OpenGL 的有效标识符。
必须在存储 OpenGL 对象之前初始化变量,因为这是稍后异步完成的。那么我可以以某种方式强制 OpenGL 以 1 而不是 0 开始索引吗?或者我应该使用GLint
并初始化为-1
?
我想以一种干净的方式解决这个问题。当然,我可以存储一对变量和一个布尔标志或类似的东西。但这将是hacky。你如何看待这个问题?
我想将它们初始化为零,但不幸的是,这是 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.
当然,我可以存储一对变量和一个布尔标志或类似的东西。但这将是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
}