在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法線?所以我只能爲位置屬性節省內存?
[Rendering mesh with multiple indices]的可能重複(http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –
是的。謝謝。 –