时间:2011-10-22 20:17:09

标签: ios opengl-es

我正在看苹果如何使用顶点数组的例子:

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_POSITIONATTRIB_COLOR是用户定义的,因此opengl不应该知道它的含义。具体来说,我尝试使用恒定颜色和顶点/纹理数组。如果我将ATTRIB_COLOR更改为ATTRIB_TEXTURE,OpenGL将不会注意到任何事情,我该怎么做?

1 个答案:

答案 0 :(得分:4)

注意:以下假设是OpenGL ES 2.0。

OpenGL既不知道也不关心任何特定顶点属性背后的含义。它想要的只是一个数字:一个属性索引。

您的顶点着色器使用attribute关键字定义了许多属性作为输入。在链接程序之前,使用glBindAttribLocation将这些GLSL属性连接到OpenGL属性索引是您的工作。因此,如果将着色器位置属性绑定到属性0,则属性0仅是位置。