在GLSL着色器中,如果我有以下布局规范:
extensions:
位置之间是否存在差距?这些差距对数据的实际内存布局或性能有影响吗?
答案 0 :(得分:2)
如果不对各种实现进行测试,是否会影响性能。但是,就OpenGL规范而言,统一的位置只是数字;它们并不代表硬件的任何具体内容。从标准化的角度来看,地点差距很小。
答案 1 :(得分:2)
大多数OpenGL实现确实对属性,制服等提供的绑定数量有上限。因此,如果指定的数字高于最大限制,则GL可能无法正确处理它。
但其中很多都是特定于实现的。例如,一个实现可能只允许最多16个 * 属性位置,但只要唯一位置的数量不超过16,就没有问题索引任何有效整数值。
更重要的是,简单地跳过地点没有限制:
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'不断涌入我的脑海。