OpenGL/GLSL 着色器中统一位置之间是否存在间隙是否重要?
Does it matter if there are gaps between uniform locations in OpenGL/GLSL shaders?
在 GLSL 着色器中,如果我有以下布局规范:
layout (location = 0) uniform mat4 modelMatrix;
layout (location = 1) uniform mat4 viewMatrix;
layout (location = 5) uniform mat4 projMatrix;
layout (location = 30) uniform vec3 diffuseColor;
layout (location = 40) uniform vec3 specularColor;
void main()
{
...
}
位置之间有空隙重要吗?这些差距对数据的实际内存布局或性能有任何影响吗?
如果不对各种实现进行测试,就无法知道它是否会影响性能。但是,就 OpenGL 规范而言,统一的位置只是数字;它们不代表硬件的任何具体信息。所以从标准化的角度来看,位置上的差距是可以的。
大多数 OpenGL 实现确实对提供给属性、制服等的绑定数量有上限。因此,如果您指定的数字超过最大限制,GL 可能无法正确处理。
但其中很多是特定于实现的。例如,一个实现可能只允许最多 16* 个属性位置,但只要唯一位置的数量不超过 16 个,就可以索引任何有效的整数值。 =12=]
更重要的是,简单地跳过位置没有限制:
layout(location = 0) in vec2 vertex;
layout(location = 1) in vec4 color;
layout(location = 3) in uint indicator;
layout(location = 7) in vec2 tex;
当然,您按预期绑定了:
glEnableVertexArrayAttrib(0);
glEnableVertexArrayAttrib(1);
glEnableVertexArrayAttrib(3);
glEnableVertexArrayAttrib(7);
//Assuming all the data is tightly packed in a single Array Buffer
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, (void*)(36));
glVertexAttribPointer(1, 4, GL_FLOAT, false, 8, (void*)(36));
glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 24, (void*)(36));
glVertexAttribPointer(7, 2, GL_FLOAT, false, 28, (void*)(36));
*我没有查过,但我知道 OpenGL 保证 实现至少支持一定数量的属性和统一位置和绑定。我不知道那个数字是多少,但出于某种原因,数字“84”一直在我脑海中闪现。
在 GLSL 着色器中,如果我有以下布局规范:
layout (location = 0) uniform mat4 modelMatrix;
layout (location = 1) uniform mat4 viewMatrix;
layout (location = 5) uniform mat4 projMatrix;
layout (location = 30) uniform vec3 diffuseColor;
layout (location = 40) uniform vec3 specularColor;
void main()
{
...
}
位置之间有空隙重要吗?这些差距对数据的实际内存布局或性能有任何影响吗?
如果不对各种实现进行测试,就无法知道它是否会影响性能。但是,就 OpenGL 规范而言,统一的位置只是数字;它们不代表硬件的任何具体信息。所以从标准化的角度来看,位置上的差距是可以的。
大多数 OpenGL 实现确实对提供给属性、制服等的绑定数量有上限。因此,如果您指定的数字超过最大限制,GL 可能无法正确处理。
但其中很多是特定于实现的。例如,一个实现可能只允许最多 16* 个属性位置,但只要唯一位置的数量不超过 16 个,就可以索引任何有效的整数值。 =12=]
更重要的是,简单地跳过位置没有限制:
layout(location = 0) in vec2 vertex;
layout(location = 1) in vec4 color;
layout(location = 3) in uint indicator;
layout(location = 7) in vec2 tex;
当然,您按预期绑定了:
glEnableVertexArrayAttrib(0);
glEnableVertexArrayAttrib(1);
glEnableVertexArrayAttrib(3);
glEnableVertexArrayAttrib(7);
//Assuming all the data is tightly packed in a single Array Buffer
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, (void*)(36));
glVertexAttribPointer(1, 4, GL_FLOAT, false, 8, (void*)(36));
glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, 24, (void*)(36));
glVertexAttribPointer(7, 2, GL_FLOAT, false, 28, (void*)(36));
*我没有查过,但我知道 OpenGL 保证 实现至少支持一定数量的属性和统一位置和绑定。我不知道那个数字是多少,但出于某种原因,数字“84”一直在我脑海中闪现。