Рендеринг полигонов сетки в OpenGL - очень медленный - PullRequest
3 голосов
/ 09 августа 2011

Я недавно перешел из промежуточного режима и начал новый процесс рендеринга. Должно быть что-то, чего я не понимаю. Я думаю, что это как-то связано с индексами.

Вот моя диаграмма: Region-> Mesh-> Polygon Array-> 3 индекса вершин, которые ссылаются на основной список вершин.

Вот мой код рендеринга:

// Render the mesh
void WLD::render(GLuint* textures, long curRegion, CFrustum cfrustum)
{

    int num = 0;

    // Set up rendering states
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    // Set up my indices
    GLuint indices[3];

    // Cycle through the PVS
    while(num < regions[curRegion].visibility.size())
    {
        int i = regions[curRegion].visibility[num];

        // Make sure the region is not "dead"
        if(!regions[i].dead && regions[i].meshptr != NULL)
        {
            // Check to see if the mesh is in the frustum
            if(cfrustum.BoxInFrustum(regions[i].meshptr->min[0], regions[i].meshptr->min[2], regions[i].meshptr->min[1], regions[i].meshptr->max[0], regions[i].meshptr->max[2], regions[i].meshptr->max[1]))
            {
                // Cycle through every polygon in the mesh and render it
                for(int j = 0; j < regions[i].meshptr->polygonCount; j++)
                {   
                    // Assign the index for the polygon to the index in the huge vertex array
                    // This I think, is redundant
                    indices[0] = regions[i].meshptr->poly[j].vertIndex[0];
                    indices[1] = regions[i].meshptr->poly[j].vertIndex[1];
                    indices[2] = regions[i].meshptr->poly[j].vertIndex[2];

                    // Enable texturing and bind the appropriate texture
                    glEnable(GL_TEXTURE_2D);
                    glBindTexture(GL_TEXTURE_2D, textures[regions[i].meshptr->poly[j].tex]);

                    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);

                    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);

                    // Draw
                    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
                }
            }
        }
    num++;
    }

    // End of rendering - disable states
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

Извините, если я что-то пропустил. И я очень ценю отзывы и помощь в этом. Я бы даже подумал заплатить кому-то, кто хорош с OpenGL и оптимизацией, чтобы помочь мне в этом.

1 Ответ

8 голосов
/ 09 августа 2011

Нет смысла использовать рендеринг массива, если вы рендерите только 3 вершины за раз. Идея состоит в том, чтобы отправить тысячи через один звонок. То есть вы визуализируете один «Массив полигонов» или «Сетка» одним вызовом.

...