布局量词(位置)是否应该在统一/输入/输出之间有所不同?

Hao*_*Liu 6 opengl shader glsl

我现在正在为我的 GLSL 着色器设置布局量词(位置)。这个问题让我想到了这些量词 ID 是否需要彼此不同。

是否必须是:

layout (location = 0) uniform vec3 v1;
layout (location = 1) in vec3 v2;
layout (location = 2) uniform vec3 v3;
layout (location = 3) in vec3 v4;
Run Code Online (Sandbox Code Playgroud)

或者它可以是(因为位置可以指定为制服或输入):

layout (location = 0) uniform vec3 v1;
layout (location = 0) in vec3 v2;
layout (location = 1) uniform vec3 v3;
layout (location = 1) in vec3 v4;
Run Code Online (Sandbox Code Playgroud)

谢谢。

Rab*_*d76 8

对于顶点着色器属性,布局位置是属性索引,而统一变量的布局位置是统一位置。这些是不同的东西。

如果不设置显式布局位置,链接shader程序后读取位置,可以看到两者可以在同一个范围内。这可以通过glGetAttribLocationglGetUniformLocation来完成

您的两个变体都是正确且可能的。属性位置必须唯一,统一位置必须唯一。但它们不必是明确的,超出位置索引类型。

有关布局限定符的更多详细信息,我推荐 Khronos Group 的 OGL 和 GLSL 文档: 布局限定符 (GLSL)

分别参见OpenGL 4.6 API Core Profile Specification-7.3.1 Program Interfaces

接口的活动资源列表中的每个条目都分配有一个唯一的无符号整数索引,范围为 0 到 N ? 1,其中 N 是活动资源列表中的条目数。

统一变量的接口类型是UNIFORM,而属性的类型是PROGRAM_INPUT。通过指令glGetProgramResourceLocation的程序接口类型和名称可以得到不同程序资源的位置。