我正在看苹果如何使用顶点数组的例子:
typedef struct _vertexStruct
{
GLfloat position[2];
GLubyte color[4];
} vertexStruct;
enum {
ATTRIB_POSITION,
ATTRIB_COLOR,
NUM_ATTRIBUTES };
void DrawModel()
{
const vertexStruct vertices[] = {...};
const GLubyte indices[] = {...};
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE,
sizeof(vertexStruct), &vertices[0].position);
glEnableVertexAttribArray(ATTRIB_POSITION);
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE,
sizeof(vertexStruct), &vertices[0].color);
glEnableVertexAttribArray(ATTRIB_COLOR);
glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte),
GL_UNSIGNED_BYTE, indices);
}
(source)
OpenGL如何知道哪一个是颜色,哪一个是顶点? ATTRIB_POSITION
和ATTRIB_COLOR
是用户定义的,因此opengl不应该知道它的含义。具体来说,我尝试使用恒定颜色和顶点/纹理数组。如果我将ATTRIB_COLOR
更改为ATTRIB_TEXTURE
,OpenGL将不会注意到任何事情,我该怎么做?
答案 0 :(得分:4)
注意:以下假设是OpenGL ES 2.0。
OpenGL既不知道也不关心任何特定顶点属性背后的含义。它想要的只是一个数字:一个属性索引。
您的顶点着色器使用attribute
关键字定义了许多属性作为输入。在链接程序之前,使用glBindAttribLocation
将这些GLSL属性连接到OpenGL属性索引是您的工作。因此,如果将着色器位置属性绑定到属性0,则属性0仅是位置。