Преобразовать треугольные полосы в треугольники? - PullRequest
2 голосов
/ 15 августа 2010

Я использую библиотеку тесселяции GPC, и она выводит треугольные полосы.Пример показывает рендеринг следующим образом:

for (s = 0; s < tri.num_strips; s++)
{
    glBegin(GL_TRIANGLE_STRIP);
    for (v = 0; v < tri.strip[s].num_vertices; v++)
        glVertex2d(tri.strip[s].vertex[v].x, tri.strip[s].vertex[v].y);
    glEnd();
}

Проблема заключается в том, что он рендерит несколько треугольных полос.Это проблема для меня.Мое приложение рендерится с VBO, перкулярно 1 VBO на 1 полигон.Мне нужен способ изменить приведенный выше код, чтобы вместо этого он выглядел примерно так:

glBegin(GL_TRIANGLES);
for (s = 0; s < tri.num_strips; s++)
{
    // How should I specify vertices here?      
}
glEnd();

Как я мог это сделать?

1 Ответ

10 голосов
/ 15 августа 2010

перкулярно 1 VBO на 1 многоугольник

Вау. 1 VBO на полигон не будет эффективным. Убивает всю причину для буфера вершин. Идея буфера вершин состоит в том, чтобы втиснуть в него как можно больше вершин. Вы можете поместить несколько полос треугольников в один буфер вершин или визуализировать отдельные примитивы, которые хранятся в одном буфере.

Мне нужен способ изменить приведенный выше код, чтобы вместо этого он выглядел примерно так:

Это должно работать:

glBegin(GL_TRIANGLES);
for (v= 0; v < tri.strip[s].num_vertices-2; v++)
    if (v & 1){
        glVertex2d(tri.strip[s].vertex[v].x, tri.strip[s].vertex[v].y);
        glVertex2d(tri.strip[s].vertex[v+1].x, tri.strip[s].vertex[v+1].y);
        glVertex2d(tri.strip[s].vertex[v+2].x, tri.strip[s].vertex[v+2].y);
    }
    else{
        glVertex2d(tri.strip[s].vertex[v].x, tri.strip[s].vertex[v].y);
        glVertex2d(tri.strip[s].vertex[v+2].x, tri.strip[s].vertex[v+2].y);
        glVertex2d(tri.strip[s].vertex[v+1].x, tri.strip[s].vertex[v+1].y);
    }
glEnd();

Поскольку триангуляция треугольных полос идет следующим образом (числа представляют индексы вершин):

0----2
|   /|
|  / |
| /  |
|/   |
1----3

Примечание: я предполагаю, что вершины в треугольных полосках хранятся в том же порядке, что и на моей картинке И что вы хотите, чтобы вершины треугольников отправлялись против часовой стрелки. Если вы хотите, чтобы они были CW, используйте другой код:

glBegin(GL_TRIANGLES);
for (v= 0; v < tri.strip[s].num_vertices-2; v++)
    if (v & 1){
        glVertex2d(tri.strip[s].vertex[v].x, tri.strip[s].vertex[v].y);
        glVertex2d(tri.strip[s].vertex[v+2].x, tri.strip[s].vertex[v+2].y);
        glVertex2d(tri.strip[s].vertex[v+1].x, tri.strip[s].vertex[v+1].y);
    }
    else{
        glVertex2d(tri.strip[s].vertex[v].x, tri.strip[s].vertex[v].y);
        glVertex2d(tri.strip[s].vertex[v+1].x, tri.strip[s].vertex[v+1].y);
        glVertex2d(tri.strip[s].vertex[v+2].x, tri.strip[s].vertex[v+2].y);
    }
glEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...