OpenGL纹理ID的范围是多少?

12

我有一个对象,它拥有一个属性Texture_ID。我需要在构造函数中初始化Texture_ID的值,因此我希望使用一些未被OpenGL使用过的值来表示纹理尚未设置。

我不知道0是否是一个好的值?如果OpenGL对纹理ID应用了某个范围,我想要一个超出这个范围的值。有什么建议吗?

3个回答

18

0就是你需要的值(表示未设置纹理ID/未创建的纹理),因为0从来不是一个有效的纹理ID。


8
+1 参见这里。 "数值零被保留用于代表每个纹理目标的默认纹理。" - user786653
3
如果您打算使用这个类创建纹理对象,那么任何您创建的纹理对象都将具有非零值。如果是这样,零值是完全可以接受的。 - R. Martinho Fernandes
2
@Paul 他似乎是正确的。但是关于OpenGL参考,“默认纹理”只是“没有纹理”或“没有应用程序创建的纹理对象”的另一个术语。因此,将0传递给glBindTexture不会导致错误,但也没有任何效果(或未定义的效果、黑色纹理或其他)。因此,0非常适合表示未初始化/无效的纹理。 - Christian Rau
3
实际上,“默认纹理”这一概念是OpenGL-1.0的一个时代错误,因为当时还没有纹理对象。要使用多个纹理,人们可以在绘制待纹理几何体之前使用glTexImage,或者使用显示列表来封装其中的纹理图像;这也是为什么在现代OpenGL中,共享显示列表将共享纹理的原因。由于当时只有纹理单元而没有纹理对象,OpenGL-1.1引入了“默认纹理”这个术语作为遗留(即当时已经过时)OpenGL-1.1程序的故障保护。 - datenwolf
1
我指的当然是“……遗留的OpenGL-1.0程序。”太晚编辑那个评论了。 - datenwolf
显示剩余2条评论

2

我更愿意在构造函数中初始化纹理。这样你就永远不会有一个处于无效状态的对象。


但在我的项目中,当对象还没有纹理时就初始化它。这是项目的限制。例如:我必须展示一个带有颜色的立方体,然后打开一个图像文件来获取纹理以绘制在立方体上,因此在这种情况下,在构造函数中,纹理尚未知道。 - jondinham
4
构造函数可能在有效的OpenGL上下文不存在时被调用,这将导致多个问题。 - datenwolf
@datenwolf:如果我有一个代表OpenGL纹理对象的对象,那么这个对象在没有OpenGL上下文的情况下是没有意义的。 - R. Martinho Fernandes
3
在这种情况下,一个好的面向对象设计应该确保按照约定将OpenGL上下文(或封装了引用的上下文)传递给纹理对象构造函数。好的库设计可以通过难以以错误的方式使用库来识别。 - datenwolf
@datenwolf:是的,我完全同意。 - R. Martinho Fernandes

2

0 是OpenGL用于其自己的默认纹理的值。它从不将该值返回给您,您可以将该值用于错误检查。

但我建议使用-1


7
纹理 ID 是 GLuint 类型,意味着“无符号整数”,我认为“-1”不是有效的。 - jondinham
4
那么使用0xffffffff。对你来说它仍然是-1 - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接