【问题标题】:Issue when porting from OpenGL 1.1 to OpenGL-ES 2.0从 OpenGL 1.1 移植到 OpenGL-ES 2.0 时的问题
【发布时间】:2017-10-26 16:36:36
【问题描述】:

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

如果您想了解其他信息,请询问我。

【问题讨论】:

  • 这对于正交投影矩阵看起来是正确的。正在发生什么,您预计会发生什么?

标签: opengl opengl-es glsl opengl-es-2.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 个顶点。所以不可能从中进行渲染。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多