opengl - 为 OpenGL 子类型化数字参数的最佳方法是什么?

标签 opengl ada specifications

在 OpenGL 规范中,有一些参数采用 GL_OBJECTENUMERATIONi 的一组值,其中 i 的范围从 0 到由类似 GL_MAX_OBJECT 表示的某个数字。 (作为一个例子,灯光是一个“对象”。)很明显,指示的数字是上限,将通过提供一些间接的 glGet 函数传递。

但是,根据 OpenGL 规范的字面解释,glActiveTexture 的“纹理”参数必须是 GL_TEXTUREi 之一,其中 i 的范围从 0 (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 表示接受的常量集必须GL_TEXTURE0GL_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/

相关文章:

c++ - OpenGL纹理倒置

c++ - OpenCL - OpenGL - Interop:如何填充 cl::ImageGL

c++ - OpenGL Shader 在 AMD 机器上不能正常工作

ada - 如何在 Ada 中存储(访问)Integer 的运算符?

ada - 数组(数组'第一个) "array index check might fail"

艾达 Hello World 示例

javascript - 为什么 fetch Body 对象只能读取一次?

c - 这两种类型在 OpenGL 中等效吗?

uml - 标准 UML 到代码映射(正向工程)?

c++ - 双接口(interface)规范