2011-10-22 38 views
0

我在看蘋果如何使用頂點數組的例子:如何OpenGLES知道哪個屬性陣列指的是

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不會注意到一件事,我該怎麼做?

回答

4

注意:以下假設爲OpenGL ES 2.0。

OpenGL既不知道也不關心任何特定頂點屬性背後的含義。它想要的只是一個數字:屬性索引。

您的頂點着色器使用attribute關鍵字定義了一系列屬性作爲輸入。在鏈接程序之前,使用glBindAttribLocation將這些GLSL屬性連接到OpenGL屬性索引是您的工作。因此,如果將着色器位置屬性綁定到屬性0,則屬性0僅爲位置。

+0

因此,如果沒有着色器,我不能使用它? – Dani

+0

@Dani是的,OpenGL ES 2.0需要使用着色器。 –

+0

@MatiasValdenegro:它是否提供默認着色器? – Dani

相關問題