2012-08-29 26 views
3

在OpenGL中(OpenGL ES的2.0),我可以使用多於一個的GL_ELEMENT_ARRAY_BUFFER更多不同GL_ARRAY_BUFFER緩衝器?我在讀「OpenGL ES 2.0的編程指南」,第6章「頂點屬性,數組和緩衝物」,有源例如:幾個GL_ARRAY_BUFFER(對於位置,法線,紋理coords)使用和一個GL_ELEMENT_ARRAY_BUFFER(「用於存儲有元素索引「)。使用不同GL_ELEMENT_ARRAY_BUFFER在一個着色器不同的屬性?

雖然我寫的問題,我得到,我不能發送更多的一個索引數組到glDrawElements,所以如果我使用緩衝區,也許只有最後綁定GL_ELEMENT_ARRAY_BUFFER用於繪圖。但是,節省內存(glDrawElements的目的是什麼)?我會說明我面臨的問題。

有2門陣列(如GL_ARRAY_BUFFERs) - 8個頂點和6個法線指數

GLfloat gVertexPositions[] = 
{ 
    0.5f, 0.5f, 0.5f, 
    0.5f, -0.5f, 0.5f, 
    -0.5f, -0.5f, 0.5f, 
    -0.5f, 0.5f, 0.5f, 
    0.5f, 0.5f, -0.5f, 
    0.5f, -0.5f, -0.5f, 
    -0.5f, -0.5f, -0.5f, 
    -0.5f, 0.5f, -0.5f 
}; 

GLfloat gVertexNormals[] = 
{ 
    1.0f, 0.0f, 0.0f, // top 
    -1.0f, 0.0f, 0.0f, // bottom 
    0.0f, 1.0f, 0.0f, // right 
    0.0f, -1.0f, 0.0f, // left 
    0.0f, 0.0f, 1.0f, // back 
    0.0f, 0.0f, -1.0f // front 
}; 

2陣列(如GL_ELEMENT_ARRAY_BUFFERs)

GLubyte gVertexPositionIndices[] = 
{ 
    0, 1, 2, // top 
    2, 3, 0, 
    0, 4, 1, // right 
    1, 4, 5, 
    5, 4, 7, // bottom 
    6, 5, 7, 
    2, 6, 7, // left 
    2, 7, 3, 
    1, 4, 2, // front 
    2, 4, 5, 
    0, 3, 4, // back 
    7, 4, 3 
}; 

GLubyte gVertexNormalIndices[] = 
{ 
    0, 0, 0, 
    0, 0, 0, 
    2, 2, 2, 
    2, 2, 2, 
    1, 1, 1, 
    1, 1, 1, 
    3, 3, 3, 
    3, 3, 3, 
    5, 5, 5, 
    5, 5, 5, 
    4, 4, 4, 
    4, 4, 4 
}; 

我設置頂點屬性狀態

glBindAttribLocation(program, ATTRIB_POSITION, "a_position"); 
    glBindAttribLocation(program, ATTRIB_NORMAL, "a_normal"); 

//..... 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_POSITION_INDICES]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 36, gVertexPositionIndices, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_POSITION_DATA]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 8, gVertexPositions, GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_NORMAL_INDICES]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 36, gVertexNormalIndices, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_NORMAL_DATA]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 6, gVertexNormals, GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_POSITION_INDICES]); 
    glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_POSITION_DATA]); 
    glEnableVertexAttribArray(ATTRIB_POSITION); 

    glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_NORMAL_DATA]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_NORMAL_INDICES]); 
    glEnableVertexAttribArray(ATTRIB_NORMAL); 

    glVertexAttribPointer(ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0); 

然後畫

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, 0); 

和屏幕是空的(因爲最後GL_ELEMENT_ARRAY_BUFFER是使用「a_position」屬性,所有的三胞胎具有相同的數字)

所有我想要的 - 程序使36個頂點,使用gVertexPositionIndices和gVertexPositions設置自己的立場他們使用gVertexNormalIndices的gVertexNormals的法線。我懷疑這是可能的,但我想確切地知道。如果這是不可能的,那麼正確的方法是什麼?我一定要使用8周* 3的float位置,對指數的36個字節,36周* 3的float法線?所以我只能爲位置屬性節省內存?

+3

[Rendering mesh with multiple indices]的可能重複(http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –

+0

是的。謝謝。 –

回答

1

我希望我不是太晚了,但我做的是設置在頂點數組中的每個頂點的基礎上的法線,然後使用適當的步伐,並宣佈頂點屬性時緩衝偏移。這裏是我的代碼申報的頂點和法線:

GLfloat BlockVertexData[144] = { 

//Right side... 
//Vertices...   //Normals...   
1.0f, 2.0f, 0.5f,  1.0f, 0.0f, 0.0f, //B 
1.0f, 2.0f, -0.5f,  1.0f, 0.0f, 0.0f, //F 
1.0f, -2.0f, 0.5f,  1.0f, 0.0f, 0.0f, //D 
1.0f, -2.0f, -0.5f,  1.0f, 0.0f, 0.0f, //H 

//Front side... 
-1.0f, 2.0f, 0.5f,  0.0f, 0.0f, 1.0f, //A 
1.0f, 2.0f, 0.5f,  0.0f, 0.0f, 1.0f, //B 
-1.0f, -2.0f, 0.5f,  0.0f, 0.0f, 1.0f, //C 
1.0f, -2.0f, 0.5f,  0.0f, 0.0f, 1.0f, //D 

//Left side... 
-1.0f, 2.0f, 0.5f, -1.0f, 0.0f, 0.0f, //A 
-1.0f, 2.0f, -0.5f, -1.0f, 0.0f, 0.0f, //E 
-1.0f, -2.0f, 0.5f, -1.0f, 0.0f, 0.0f, //C 
-1.0f, -2.0f, -0.5f, -1.0f, 0.0f, 0.0f, //G 

//Back side... 
-1.0f, 2.0f, -0.5f,  0.0f, 0.0f, -1.0f, //E 
1.0f, 2.0f, -0.5f,  0.0f, 0.0f, -1.0f, //F 
-1.0f, -2.0f, -0.5f,  0.0f, 0.0f, -1.0f, //G 
1.0f, -2.0f, -0.5f,  0.0f, 0.0f, -1.0f, //H 

//Top side... 
-1.0f, 2.0f, -0.5f,  0.0f, 1.0f, 0.0f, //E 
1.0f, 2.0f, -0.5f,  0.0f, 1.0f, 0.0f, //F 
-1.0f, 2.0f, 0.5f,  0.0f, 1.0f, 0.0f, //A 
1.0f, 2.0f, 0.5f,  0.0f, 1.0f, 0.0f, //B 

//Bottom side... 
-1.0f, -2.0f, -0.5f,  0.0f, -1.0f, 0.0f, //G 
1.0f, -2.0f, -0.5f,  0.0f, -1.0f, 0.0f, //H 
-1.0f, -2.0f, 0.5f,  0.0f, -1.0f, 0.0f, //C 
1.0f, -2.0f, 0.5f,  0.0f, -1.0f, 0.0f //D }; 

GLuint BlockIndicesData[36] = { 

//Right side... 
2, 0, 3,  0, 1, 3, 

//Front side... 
6, 4, 7,  4, 5, 7, 

//Left side... 
11, 10, 8, 8, 9, 11, 

//Back side... 
15, 14, 12, 12, 13, 15, 

//Top side... 
19, 18, 16, 16, 17, 19, 

//Bottom side... 
23, 22, 20, 20, 21, 23 }; 

和這裏的聲明屬性代碼:

// The stride shows that there are 6 floats in each row. 
GLsizei stride = 6 * sizeof(GLfloat); 
GLuint attribute; 

attribute = glGetAttribLocation(program, "VertexPosition"); 
glEnableVertexAttribArray(attribute); 
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, 0); 

attribute = glGetAttribLocation(self.program, "VertexNormal"); 
glEnableVertexAttribArray(attribute); 
// The sixth parameter indicates the buffer offset, so here there were 3 floats preceding it, so this indicates it. 
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid *)(sizeof(GLfloat) * 3)); 

我知道這可能會佔用更多的內存,但也許有人能想出更好的解決方案。這是我能想到解決你的問題。

相關問題