glBindAttribLocation
是手动给attribute分配一个location,方便后续直接使用
void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);
如果program里面没有对应name的attribute,并不会报错,仅仅会将index和attribute name对应起来。
void GLProgram::bindPredefinedVertexAttribs() { static const struct { const char *attributeName; int location; } attribute_locations[] = { {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION}, {GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORD}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::VERTEX_ATTRIB_TEX_COORD1}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD2, GLProgram::VERTEX_ATTRIB_TEX_COORD2}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD3, GLProgram::VERTEX_ATTRIB_TEX_COORD3}, {GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::VERTEX_ATTRIB_NORMAL}, }; const int size = sizeof(attribute_locations) / sizeof(attribute_locations[0]); for(int i=0; i<size;i++) { glBindAttribLocation(_program, attribute_locations[i].location, attribute_locations[i].attributeName); } }
GLProgramState
更像是对GLProgram的一个状态,GLProgram有点像类的声明,GLProgramState更像是类的示例,state里面可以给具体的uniform、attribute等赋值,形成一个状态。
glGetProgramiv 函数可以用来查询 shader program 对象的一些信息,其中 GL_ACTIVE_ATTRIBUTES 枚举值可以用来获取当前 shader program 中定义的 attribute 变量数量。