2012-08-11 57 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

相关问题