我正在尝试在iOS中使用OpenGL进行简单测试(ES 2.0,但如果它是带有核心配置文件的常规GL 3.5或基本上没有固定管道的任何实现,则应该是相同的):
我已正确设置所有内容(上下文,着色器,mvl矩阵等),并通过glDrawArrays成功渲染三角形,VBO如此:
- (void)loadActors
{
GLfloat triangle1[] = {
-1.0, -2.0, 0.0,
3.0, 0.0, 0.0,
0.0, 1.5, 0.0
};
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
glEnableVertexAttribArray(0);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(1., 0., 0., 1.);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
现在,我正在尝试启用索引。所以我创建另一个(全局)数组,它只保存0,1,2并尝试使用它来索引VBO。像这样:
- (void)loadActors
{
GLfloat triangle1[] = {
-1.0, -2.0, 0.0,
3.0, 0.0, 0.0,
0.0, 1.5, 0.0
};
indicesG = malloc(sizeof(GLuint)*3);
indicesG[0] = 0;
indicesG[1] = 1;
indicesG[2] = 2;
GLuint VBO[2];
glGenBuffers(2, VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicesG), indicesG, GL_STATIC_DRAW);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(1., 0., 0., 1.);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
}
我希望索引数组只调用VBO的顶点0,1和2,如果我没有使用GL_ELEMENT_ARRAY_BUFFER,则得到相同的三角形。但相反,似乎没有任何东西被绘制出来。
我错过了什么?
答案 0 :(得分:0)
你有3
作为glDrawElements的最后一个参数,应该是0
,因为你想从索引VBO的开头开始计数,而不是3个字节。
答案 1 :(得分:0)
问题实际上是我对indicesG数组大小的计算。我正在做sizeof(indicesG)
,应该做sizeof(GLuint)*3
适用于glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*3, indicesG, GL_STATIC_DRAW);