2012-08-11 56 views
2

我不能使用超過1對頂點和索引緩衝區對象的渲染我的所有對象。爲了檢查一切,我初始化了3個對象並渲染它們。這會導致頭兩個幾何體扭曲,第三個對象幾何體會渲染得很好(不完美)。呈現多個頂點和索引緩衝區對象(IOS - OpenGLES 2.0)

當我剛初始化所有3,但呈現只是第一,它再次顯示失真的幾何形狀和莫名其妙的第三個幾何更加明顯(即使我不是渲染它)。

但是,如果我初始化和使它們中的任何一個,它呈現就好(完美)。 這裏是我的代碼:

float tempAngles[4] = {0, 60, 180, 360}; 
pieOne = [[IVNode alloc]initWithPieGeometry:0.75 thickness:0.20 startAngle:tempAngles[0]*M_PI/180 andEndAngle:tempAngles[1]*M_PI/180]; 

glGenBuffers(1, &vertexBuffer1); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer1);//vertexBuffer[i]); 
glBufferData(GL_ARRAY_BUFFER, [pieOne.pie getVertexSize]*sizeof(GLfloat), [pieOne.pie returnVertexArray] , GL_STATIC_DRAW); 

glGenBuffers(1, &indexBuffer1); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer1); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, [pieOne.pie getIndicesSize]*sizeof(GLushort),[pieOne.pie returnIndexArray], GL_STATIC_DRAW); 

pieTwo = [[IVNode alloc]initWithPieGeometry:1.0 thickness:0.20 startAngle:tempAngles[1]*M_PI/180 andEndAngle:tempAngles[2]*M_PI/180]; 

glGenBuffers(1, &vertexBuffer2); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2);//vertexBuffer[i]); 
glBufferData(GL_ARRAY_BUFFER, [pieTwo.pie getVertexSize]*sizeof(GLfloat), [pieTwo.pie returnVertexArray] , GL_STATIC_DRAW); 

glGenBuffers(1, &indexBuffer2); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer2); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, [pieTwo.pie getIndicesSize]*sizeof(GLushort),[pieTwo.pie returnIndexArray], GL_STATIC_DRAW); 


pieThree = [[IVNode alloc]initWithPieGeometry:0.75 thickness:0.20 startAngle:tempAngles[2]*M_PI/180 andEndAngle:tempAngles[3]*M_PI/180]; 

glGenBuffers(1, &vertexBuffer3); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer3);//vertexBuffer[i]); 
glBufferData(GL_ARRAY_BUFFER, [pieThree.pie getVertexSize]*sizeof(GLfloat), [pieThree.pie returnVertexArray] , GL_STATIC_DRAW); 

glGenBuffers(1, &indexBuffer3); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer3); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, [pieThree.pie getIndicesSize]*sizeof(GLushort),[pieThree.pie returnIndexArray], GL_STATIC_DRAW); 

//#define BUFFER_OFFSET(i) ((char *)NULL + (i)) 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(12)); 

現在在我的渲染功能,我有:

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 

glClearColor(0.77f, 0.88f, 1.0f, 1.0f);  
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


float yellow[3][4] = {1.0f, 1.0f, 0.0f, 1.0f, 
    1.0f, 0.0f, 0.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f}; 

glUseProgram(_program); 
//1st 
GLKMatrix4 model = GLKMatrix4Identity;// GLKMatrix4MakeTranslation(1.5, 0, 0); 
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, model); 

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m); 
glUniform4f(uniforms[COLOR_VECTOR], yellow[0][0], yellow[0][1], yellow[0][2], yellow[0][3]); 

//bind corresponding buffer before drawing 
glBindBuffer(GL_ARRAY_BUFFER, indexBuffer1); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer1); 
glDrawElements(GL_TRIANGLES, [pieOne.pie getIndicesSize], GL_UNSIGNED_SHORT, (void*)0); 

//2nd  
model = GLKMatrix4MakeTranslation(0, -1, 0); 
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, model); 

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m);// 
glUniform4f(uniforms[COLOR_VECTOR], yellow[1][0], yellow[1][1], yellow[1][2], yellow[1][3]); 

//bind corresponding buffer before drawing 
glBindBuffer(GL_ARRAY_BUFFER, indexBuffer2); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer2); 
glDrawElements(GL_TRIANGLES, [pieTwo.pie getIndicesSize], GL_UNSIGNED_SHORT,(void*)0); 

//3rd 
model = GLKMatrix4MakeTranslation(-1.5, 0, 0); 
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, model); 
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m); 
glUniform4f(uniforms[COLOR_VECTOR], yellow[2][0], yellow[2][1], yellow[2][2], yellow[2][3]); 

//bind corresponding buffer before drawing 
glBindBuffer(GL_ARRAY_BUFFER, indexBuffer3); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer3); 
glDrawElements(GL_TRIANGLES, [pieThree.pie getIndicesSize], GL_UNSIGNED_SHORT, (void*)0); 

} 

getIndicesSize返回indexArray元素的數量。 getVertexSize返回vertexArray元素的數量。 returnVertexArray返回幾何體的頂點數組。 returnIndexArray返回幾何體的索引數組。頂點數組是GLfloat類型的頂點數組。 索引數組的類型是GLushort。

中產生的頂點數組元素的數量是24522. 在生成的索引數組元素的數量是22680. 在互聯網上,只有我發現沒有使用GLkit多個VBO/IBO的例子,他們確實做到了我是什麼在初始化緩衝區和渲染方面進行。 我已經在這個問題上花了近2天時間。我覺得缺少一些非常基本的東西。不知何故,最後綁定的緩衝區會影響我感受到的所有其他幾何體(基於我上面解釋的結果)。它可能是一個模擬器問題(我不這麼認爲)?快速回復將不勝感激。由於

回答

1

你似乎有關於glVertexAttribPointer功能是如何工作的一些混亂。當你調用glVertexAttribPointer時,它告訴OpenGL:

在下一次繪製調用時,從當前綁定的緩衝區地址加上提供的緩衝區偏移量開始渲染。

在此之後,如果更改綁定的緩衝區並不重要,因爲指針仍然指向函數調用時綁定的緩衝區。

因此,在這樣的代碼:

glBindBuffer(GL_ARRAY_BUFFER, indexBuffer1); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer1); 
glDrawElements(GL_TRIANGLES, [pieOne.pie getIndicesSize], GL_UNSIGNED_SHORT, (void*)0); 

調用glBindBuffer(GL_ARRAY_BUFFER)這裏絕對不做任何事情,因爲你沒有更新的指針。

glBindBuffer(GL_ARRAY_BUFFER, indexBuffer1); 
//need to set glVertexAttribPointers here 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer1); 
glDrawElements(GL_TRIANGLES, [pieOne.pie getIndicesSize], GL_UNSIGNED_SHORT, (void*)0); 
+0

非常感謝Tim的快速反應。它幫助:) !!!! – OpenGLESbeginner 2012-08-12 03:59:10

相關問題