通过 显式关联glBindVertexAttrib
。在链接程序之前调用此函数。要做到以上几点,我们会这样做:
GLuint program = glCreateProgram();
glAttachShader(program, some_shader);
glBindVertexAttrib(program, 3, "position");
glLinkProgram(program);
您可以设置多个属性。实际上,您可以将多个属性名称设置为同一个索引。这样做的想法是能够自动设置一堆映射并让 OpenGL 找出哪个与实际的着色器代码一起使用。因此,您可以将“位置”和“轴”映射到索引 3,只要您不将着色器放入具有这两个输入的系统中,就可以了。
请注意,您还可以设置不存在的属性。您可以给“正常”一个未在着色器中指定的属性。那很好;链接器只关心实际存在的属性。因此,您可以为此类事情建立一个复杂的约定,并在链接之前运行每个程序:
void AttribConvention(GLuint prog)
{
glBindVertexAttrib(program, 0, "position");
glBindVertexAttrib(program, 1, "color");
glBindVertexAttrib(program, 2, "normal");
glBindVertexAttrib(program, 3, "tangent");
glBindVertexAttrib(program, 4, "bitangent");
glBindVertexAttrib(program, 5, "texCoord");
}
GLuint program = glCreateProgram();
glAttachShader(program, some_shader);
AttribConvention(program);
glLinkProgram(program);
即使一个特定的着色器没有所有这些属性,它仍然可以工作。