原文在https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)
GLSL语言规范中也有对此的详细说明https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf
这里大致翻译如下:
布局限定符(GLSL除了这个限定符,还有很多其它限定符,比如存储限定符、内存限定符、插值限定符等,具体参看https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)),基本语法为:
layout(qualifier1, qualifier2 = value, ...) variable definition
主要有以下用法:
1、用于着色器输入/输出变量接口布局
着色器的输入/输出变量就是着色器与显存或其它着色器通信的接口,通过layout可以指定这些输入/输出变量从哪去什么值/向哪输出什么值。
1.1、顶点着色器的属性索引
layout(location = attribute index) in vec3 position;
可以指定顶点着色器输入变量使用的顶点属性索引值,一般在glVertexAttribPointer中指定属性索引值。如果同时使用了glBindAttribLocation,那么这个layout优先。
如果输入变量占用了多个属性位置槽,那么将按照属性位置顺序依次分配,如
layout(location = 2) in vec3 values[4];
values将依次获取属性位置2,3,4,5处的值。
值得注意的是,输入和输出变量的位置索引并不冲突,比如
#version 440
layout(location = 0) in vec4 inWorldPosition;
layout(location = 1) in vec4 inNormal;
layout(location = 2) in vec2 inTexCoord;
layout(location = 3) in vec4 inTangent;
layout(location = 4) in vec4 inBiTangent;
layout(location = 0) out