这是我的opengl-es 2.0代码:
{
for (surfnum=0;surfnum<surftotal;surfnum++){
for (i=0;i<triNum[surfnum];i++){
GLfloat *Vertices[] = { triArray[surfnum][i].normpt1, triArray[surfnum][i].normpt2,triArray[surfnum][i].normpt3};
glGenBuffers(1, &ui32Vbo);
glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
unsigned int uiSize = 3 * (sizeof(GLfloat) * 1);
glBufferData(GL_ARRAY_BUFFER, uiSize,*Vertices, GL_STATIC_DRAW);
}
}
}
for(int i = 0; i < 80000; ++i)
{
glClear(GL_COLOR_BUFFER_BIT);
int i32Location = glGetUniformLocation(uiProgramObject, "projmatrix");
glUniformMatrix4fv( i32Location, 1, GL_FALSE, pfIdentity);
glEnableVertexAttribArray(VERTEX_ARRAY);
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0,i);
eglSwapBuffers(eglDisplay, eglSurface);
}
这是我的opengl-es 2.0代码。我正在研究opengl 1.1,其中我能够显示iso表面形式数据。
这是我的Opengl 1.1代码:
void drawTriangle()
{
int surfnum, i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,0.6,0.1);
for (surfnum=0;surfnum<surftotal;surfnum++)
{
for (i=0;i<triNum[surfnum];i++)
{
glBegin(GL_POLYGON);
glNormal3fv(triArray[surfnum][i].normpt1);
glVertex3fv(triArray[surfnum][i].pt1);
glNormal3fv(triArray[surfnum][i].normpt2);
glVertex3fv(triArray[surfnum][i].pt2);
glNormal3fv(triArray[surfnum][i].normpt3);
glVertex3fv(triArray[surfnum][i].pt3);
glEnd();
glFlush();
glutSwapBuffers();
}
}
}
我得到的结果与我在opengl中获得的结果相同,在opengl-es 2.0中也是
警告如下:libegl:使用软件回退;
输出发生得非常缓慢 这里输出超出窗口
如果您想要其他信息,请问我。
答案 0 :(得分:1)
您的代码没有意义。
{
for (surfnum=0;surfnum<surftotal;surfnum++){
for (i=0;i<triNum[surfnum];i++){
GLfloat *Vertices[] = { triArray[surfnum][i].normpt1, triArray[surfnum][i].normpt2,triArray[surfnum][i].normpt3};
glGenBuffers(1, &ui32Vbo);
glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
unsigned int uiSize = 3 * (sizeof(GLfloat) * 1);
glBufferData(GL_ARRAY_BUFFER, uiSize,*Vertices, GL_STATIC_DRAW);
}
}
}
您实际上是为每个三角形创建缓冲区对象吗?好吧,你甚至没有这样做,因为每组3个浮点只有一个缓冲区对象,甚至不是一个完整的三角形。我只能假设这是一个顶点位置。你一直在这个循环的中间调用glGenBuffers
,所以它将尽职尽责地生成另一个缓冲区对象。创建过多的缓冲区对象可能就是您遇到软件回退的原因。
此外,normpt1
不包含正常,而不是位置?
然后就是这样:
for(int i = 0; i < 80000; ++i)
{
glClear(GL_COLOR_BUFFER_BIT);
int i32Location = glGetUniformLocation(uiProgramObject, "projmatrix");
glUniformMatrix4fv( i32Location, 1, GL_FALSE, pfIdentity);
glEnableVertexAttribArray(VERTEX_ARRAY);
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0,i);
eglSwapBuffers(eglDisplay, eglSurface);
}
首先,你没有glBindBuffer你的缓冲区对象。是的,我知道它仍然受到约束,但明确这些事情总是好的。
最重要的是,这是什么:glDrawArrays(GL_TRIANGLES, 0,i);
?数组索引不是i
吗?第三个参数需要是要绘制的顶点数。除非此值可被3整除,否则GL_TRIANGLES将失败。
但这没关系,因为你上次创建的缓冲区对象只有足够的空间容纳1个顶点。所以不可能从中进行渲染。