2

我似乎不知道如何在 GLSL 中获取统一的大小(以标量(或字节)为单位)。

目前我在枚举所有着色器常量时调用 glGetActiveUniform,但它返回的 size 参数是数组大小,而不是变量大小。

是否有获取数据大小的功能?还是将 ConstantType 映射到其大小的函数?

为了完整起见,这是我的代码:

char ConstantName[ 128 ];
GLint ConstantArraySize;
GLenum ConstantType;
glGetActiveUniform( Program, ConstantIndex, 128, nullptr, &ConstantArraySize, &ConstantType, ConstantName );
4

2 回答 2

3

GLSL 中制服的大小仅在制服存储在制服块中时才相关。对于非块状制服,你不在乎;您上传它们glUniform*并让 OpenGL 处理任何转换。

对于统一块成员,每个基本类型的统一具有特定的字节大小。单个整数和浮点数的大小为 32 位。这些类型的向量是大小 * 组件的数量。矩阵更复杂;它们存储为列/行(您可以选择)向量。列/行之间的步幅是您必须查询的内容glGetActiveUniformsiv(注意“s”)。

除非你当然使用 std140 布局,在这种情况下矩阵步幅总是 4 * 基本组件类型的数量。因此,在 std140 布局中mat4x2,存储的列优先的 a 表示vec2s 的 4 个列向量,但各个列向量之间的步幅是 4 * sizeof(float),而不是 2 * sizeof(float)。所以有 2 个浮点数的填充。

简而言之,没有理由在意。如果是非块状制服,则尺寸无关紧要。如果它是统一的块统一,那么无论如何您都应该使用 std140 布局,因此可以先验地计算它。

于 2012-10-16T22:51:19.340 回答
1

据我所知,OpenGL 中所有数据类型的大小都是标准化的。浮点数和整数是 32 位,双精度数是 64。使用 提供给您的信息glGetActiveUniform(),您可以自己计算出统一变量的大小。拥有一个 GL 函数来为您执行此操作将是多余的。

于 2012-10-16T22:18:44.903 回答