Проблема при портировании с OpenGL 1.1 на OpenGL-ES 2.0 - PullRequest
0 голосов
/ 28 июня 2011

это мой код 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 Ответ

1 голос
/ 29 июня 2011

Ваш код не имеет смысла.

{
    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 вершины.Так что невозможно отрисовать.

...