GLSL 布局属性编号

GLSL layout attribute number

我正在尝试一个着色器示例来绘制一个三角形,其中 RGB 在顶点上进行插值,并假设使用

layout (location = 0)in vec4 vertex;
layout (location = 1) in vec4 VertexColor;

在顶点着色器中会起作用,因为数组中的 4 个浮点颜色紧跟在 4 个浮点顶点之后。但是,它总是绘制一个实心的红色三角形。所以我尝试了 location = 4 只是为了得到一个黑屏。进一步实验得到location = 2的蓝色三角形,最后得到location = 3的插值结果

我的问题是,我怎么会知道输入 3 作为位置?顶点数组如下所示:

GLfloat vertices[] = {  -1.5,-1.5, 0.0, 1.0,    //first 3D vertex
                         1.0, 0.0, 0.0, 1.0,    //first color
                         0.0, 1.5, 0.0, 1.0,    //second vertex
                         0.0, 1.0, 0.0, 1.0,    //second color
                         1.5,-1.5, 0.0, 1.0,    //third vertex
                         0.0, 0.0, 1.0, 1.0,};  //third color

注意:在第一个代码块中从 layout = 3 编辑了原始 layout=1

每个位置可以容纳 4 个浮点数(一个 vec4),所以一个有效的选项也是:

layout (location = 0)in vec4 vertex;
layout (location = 1) in vec4 VertexColor;

决定什么属性来自哪里的是一组 glVertexAttribPointer 调用。

这些是我对上述 glsl 声明的期望(假设您使用 VBO)

glVertexAttribPointer(0, 4, GL_FLOAT, false, sizeof(float)*4*2, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, false, sizeof(float)*4*2, sizeof(float)*4);