是否有一种方法可以强制OpenGL标识符从1开始而不是0

Is there a way to force OpenGL identifiers to start at one instead of zero?

本文关键字:标识符 OpenGL 开始 一种 方法 是否      更新时间:2023-10-16

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

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

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

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

不,它不是。对于大多数OpenGL对象类型,0表示"不是对象"。唯一具有有效0对象的是fbo(其中0表示默认Framebuffer),转换反馈对象和纹理(您应该将视为如果它们不是对象)。

用0。使用0调用任何glDelete*都是合法的,并且不会发生任何事情,即使0是该类型的有效对象。

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

使用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
}