2011-06-28 64 views
0

时,这是我的的OpenGL-ES 2.0代码:问题移植从OpenGL的1.1至的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

这看起来正确的正投影矩阵。发生了什么,你期望会发生什么? – Mikola

回答

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?第三个参数需要是要绘制的顶点数。并且GL_TRIANGLES将失败,除非该值可被3整除。

但这并不重要,因为上次创建的缓冲区对象只有1个顶点的空间。所以它是不可能来渲染。

+0

谢谢,我明白我的错误,我会为此努力。 –