【问题标题】:Does it matter if there are gaps between uniform locations in OpenGL/GLSL shaders?OpenGL/GLSL 着色器中的统一位置之间是否存在间隙是否重要?
【发布时间】:2017-11-30 08:48:52
【问题描述】:

在 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()
{
   ...
}

位置之间有差距是否重要?这些差距是否会对数据的实际内存布局或性能产生任何影响?

【问题讨论】:

  • 规范中的相关章节是4.4.1 Input Layout Qualifiers。但据我所知,它只是一个 ID,对内存没有直接影响。
  • 有趣的问题,但我不确定是否有人可以给出答案:规范没有定义着色器内存的布局方式。但也许有人知道不同供应商是如何实现的。

标签: opengl glsl opengl-4


【解决方案1】:

如果不对各种实现进行测试,就无法知道它是否会影响性能。然而,就 OpenGL 规范而言,统一的位置只是数字;它们不代表有关硬件的任何具体内容。因此,从标准化的角度来看,位置上的差距很好。

【讨论】:

    【解决方案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”这个数字一直在我脑海中浮现。

    【讨论】:

    • 你肯定明白了,因为对于顶点属性,有点清楚这些位置根本不会影响内存布局,否则通过@987654323 指定内存布局就没有意义了@ 和 stride 参数。我觉得布局也不应该影响制服的内存布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多