从OpenGL 1.1移植到OpenGL-ES 2.0时出现问题

时间:2011-06-28 04:13:47

标签: opengl opengl-es glsl opengl-es-2.0

这是我的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:使用软件回退;
      输出发生得非常缓慢       这里输出超出窗口

如果您想要其他信息,请问我。

1 个答案:

答案 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个顶点。所以不可能从中进行渲染。