GLSL制服的尺寸?

GLSL制服的尺寸?,glsl,shader,Glsl,Shader,我似乎不知道如何在GLSL中获得统一的大小(以标量(或字节)表示) 当前,我在枚举所有着色器常量时调用glGetActiveUniform,但它返回的大小参数是数组大小,而不是变量大小 是否有获取数据大小的函数?还是将ConstantType映射到其大小的函数 为了完整起见,以下是我的代码: char ConstantName[ 128 ]; GLint ConstantArraySize; GLenum ConstantType; glGetActiveUniform( Program, Co

我似乎不知道如何在GLSL中获得统一的大小(以标量(或字节)表示)

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

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

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

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

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

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

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

当然,除非您使用std140布局,否则在这种情况下,矩阵跨距始终为基本组件类型的4*编号。因此,在std140布局中,存储的列MARGER的
mat4x2
表示
vec2
s的4个列向量,但各个列向量之间的跨距是4*sizeof(float),而不是2*sizeof(float)。所以有两个浮子值得填充


简言之,没有理由在意。如果它是非块均匀的,则大小无关。如果是统一块统一,那么无论如何都应该使用std140布局,这样就可以对其进行先验计算。

您知道要查看的统一类型吗?mat4x4?vec3?如果你这样做,那么你应该能够提供自己的尺寸。我认为GLSL规范中有关于这一点的信息,你说多余,我说方便:)我知道我可以根据类型为此编写一个大的switch语句,我只是想知道是否有一些“更好”的内置方法。谢谢你提供的信息。好吧,这就是标准委员会的看法。看C++!他们可以添加很多东西使其使用更加方便。From:“警告:GLSL中整数和浮点的特定大小和格式仅适用于GLSL 1.30及以上版本。GLSL的较低版本可能不使用这些精确的规范。”我的着色器系统在本地存储常量,因此,即使着色器程序未绑定,也可以设置它们。这还允许我测试它们是否已更改以避免冗余API调用。也许这是个坏主意。。但在我的脑海里似乎是个好主意。。谢谢你的邀请feedback@Hybrid:这并不能解释为什么需要字节大小。除非我知道常量有多大,否则我如何在本地存储它们?@Hybrid:它们对你来说有多大与它们对OpenGL内部着色器表示的大小无关
glUniformiv
takes
GLint
s
glUniformfv
接受
GLfloat
s
glUniformuiv
takes
GLuint
s。这就是您需要的所有尺寸信息。