GLSL的尺寸均匀?

时间:2012-10-16 21:09:24

标签: glsl shader

我似乎无法了解如何在GLSL中获得制服的标量(或字节)大小。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

GLSL中的均匀尺寸仅在均匀存储在统一块中时才有意义。对于非阻挡制服,你不在乎;您使用glUniform*上传它们,并让OpenGL处理​​任何转换。

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

除非你当然使用std140布局,否则矩阵步长总是4 *基本组件类型的数量。因此在std140布局中,mat4x2存储的列主要代表vec2 s的4个列向量,但各个列向量之间的步幅是4 * sizeof(float),而不是2 * sizeof(float )。所以有2个花车填充物。

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

答案 1 :(得分:0)

据我所知,OpenGL中所有数据类型的大小都是标准化的。浮点数和整数是32位,双精度数是64位。使用glGetActiveUniform()给出的信息,您可以自己计算出统一变量的大小。拥有GL功能为您做到这一点将是多余的。