在 OpenGL 规范中,有一些参数采用 GL_OBJECTENUMERATIONi
的一组值,其中 i 的范围从 0 到由类似 GL_MAX_OBJECT
表示的某个数字。 (作为一个例子,灯光是一个“对象”。)很明显,指示的数字是上限,将通过提供一些间接的 glGet 函数传递。
但是,根据 OpenGL 规范的字面解释,glActiveTexture 的“纹理”参数必须是 GL_TEXTUREi 之一,其中 i 的范围从 0 (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
表示接受的常量集必须是 GL_TEXTURE0
到 GL_TEXTURE35660
因为常量是一个值为35661的常量。
撇开语言律师不谈,这种设置意味着子类型不仅可以不相交,而且也可以乱序,因此以下 C-ish 映射是有效的:
#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84A0
#define GL_TEXTURE4 0x84A4
#define GL_TEXTURE5 0x84A5
#define GL_TEXTURE6 0x84A8
#define GL_TEXTURE7 0x84A2
首先,这个问题实际上是一个问题,还是常量总是布置得好像GL_OBJECTi
= GL_OBJECTi-1
+1 ?
如果这种关系成立,那么就有可能使用 Ada 的子类型特性来避免传入无效参数...
理想情况下,像这样:
-- This is an old [and incorrect] declaration using constants.
-- It's just here for an example.
SubType Texture_Number is Enum Range
GL_TEXTURE0..Enum'Max(
GL_MAX_TEXTURE_COORDS - 1,
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1);
但是,如果最大值是动态确定的,那么我们就必须做一些有趣的事情:
With GL_Constants;
Generic
GL_MAX_TEXTURE : Integer;
-- ...and one of those for EACH maximum for the ranges.
Package Types is
Use GL_Constants;
SubType Texture_Number is Enum Range
GL_TEXTURE0..GL_MAX_TEXTURE;
End Types;
实例化 Package GL_TYPES is new Types( GL_MAX_TEXTURE => glGet(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) );
然后使用这个新的 GL_TYPES
包...多一点工作, 并且比直接的子类型更麻烦一些。
其中大部分来自于对 OpenGL 完全陌生并且没有完全了解/理解它;但它确实提出了一些有趣的问题,即构建良好、厚实的 Ada 绑定(bind)的最佳方式。
最佳答案
means that the set of accepted constants must be GL_TEXTURE0 to GL_TEXTURE35660 because the constant is a constant of the value 35661.
不,不是这个意思。 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 是一个依赖于实现的值,将在运行时使用 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, out)
查询
关于其余部分:OpenGL 规范指出,GL_TEXTURE = GL_TEXTURE0 + i,所有其他对象类型都类似,i < n
其中 n 是一些合理的数字。
关于opengl - 为 OpenGL 子类型化数字参数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020094/