我似乎无法了解如何在GLSL中获得制服的标量(或字节)大小。
目前我调用glGetActiveUniform,因为我枚举了所有着色器常量,但它返回的size参数是数组大小,而不是可变大小。
是否有获取数据大小的功能?或者将ConstantType映射到其大小的函数?
这是我的代码,为了完整性:
char ConstantName[ 128 ];
GLint ConstantArraySize;
GLenum ConstantType;
glGetActiveUniform( Program, ConstantIndex, 128, nullptr, &ConstantArraySize, &ConstantType, ConstantName );
答案 0 :(得分:2)
GLSL中的均匀尺寸仅在均匀存储在统一块中时才有意义。对于非阻挡制服,你不在乎;您使用glUniform*
上传它们,并让OpenGL处理任何转换。
对于统一块成员,每个基本类型的统一都具有特定的字节大小。单个整数和浮点数大小为32位。这些类型的向量是大小*组件的数量。矩阵更复杂;它们存储为列/行(您可以选择)向量。列/行之间的步幅为something you have to query,glGetActiveUniformsiv
(注意“s”)。
除非你当然使用std140布局,否则矩阵步长总是4 *基本组件类型的数量。因此在std140布局中,mat4x2
存储的列主要代表vec2
s的4个列向量,但各个列向量之间的步幅是4 * sizeof(float),而不是2 * sizeof(float )。所以有2个花车填充物。
简而言之,没有理由关心。如果它是非块状统一,则尺寸无关紧要。如果它是一个统一的块统一,那么你应该使用std140布局,因此可以先验地计算它。
答案 1 :(得分:0)
据我所知,OpenGL中所有数据类型的大小都是标准化的。浮点数和整数是32位,双精度数是64位。使用glGetActiveUniform()
给出的信息,您可以自己计算出统一变量的大小。拥有GL功能为您做到这一点将是多余的。