在 OpenGL 规范中,某些参数采用一组 from 的值,GL_OBJECTENUMERATIONi
其中 i 的范围从 0 到由类似GL_MAX_OBJECT
. (作为一个例子,灯光是一个“对象”。)很明显,指示的数字是上限,将通过提供某种间接性的 glGet 函数传递。
但是,根据 OpenGL 规范的字面解释,glActiveTexture must be one of GL_TEXTUREi, where i ranges from 0 (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
的“纹理”参数意味着接受的常量集必须是GL_TEXTURE0
to,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 绑定的最佳方式。