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