OpenGL: Самый быстрый способ нарисовать смесь треугольников и четырехугольников? - PullRequest
3 голосов
/ 11 июня 2009

У меня есть структура данных меша с многоугольниками, которые могут быть треугольниками и квадратами. Какой самый быстрый способ нарисовать это с помощью OpenGL?

Медленный способ состоит в том, чтобы перебрать структуру и для каждого многоугольника сделать соответствующий glBegin() .. glEnd() с GL_QUADS или GL_TRIANGLES. Я хотел бы избежать необходимости делать glBegin() .. glEnd() для каждого многоугольника.

Другой вариант - разделить структуру на две структуры: одну, содержащую треугольники, и другую, содержащую четырехугольники, а затем перейти к ним по отдельности. Это также то, чего я хотел бы избежать, так как я действительно хочу сохранить их всех в одной структуре.

К сожалению, триангуляция четырехугольников в треугольники в настоящее время невозможна.

Есть ли хорошее решение для этого?

Ответы [ 3 ]

3 голосов
/ 12 июня 2009

Вы всегда можете конвертировать их все в треугольники, тоже довольно легко.

В основном псевдокод будет выглядеть примерно так:

glBegin(GL_TRIANGLES);
for each (object *a in objectList)
  if (a->type == TRIANGLE)
    glVertex3fv(a->vertices);
  if (a->type == QUAD)
  {
    glVertex3f(a->vertices[0]);
    glVertex3f(a->vertices[1]);
    glVertex3f(a->vertices[2]);

    glVertex3f(a->vertices[2]);
    glVertex3f(a->vertices[1]);
    glVertex3f(a->vertices[3]);
  }
glEnd();

Вы должны быть осторожны, сохраняя их ориентацию одинаково (по часовой или против часовой стрелки), но это должно сработать!

3 голосов
/ 11 июня 2009

Возможно, вы захотите создать две таблицы индексов, одну для четырехугольников, одну для треугольников, а затем написать все квады, за которыми следуют треугольники (или обратные). Чтобы рисовать с использованием массива индексов, используйте glDrawElements с набором glVertexPointer и glEnableClientState , чтобы заставить его работать.

Более того, если вы действительно хотите набрать скорость, вы можете поместить все свои вершины в VBO и свой индекс. Таким образом вы получите все свои вершины и индексы в ОЗУ графического процессора.

2 голосов
/ 25 июня 2009

Что касается glPolygonMode (GL_LINE) и разложенного GL_QUADS, glEdgeFlagPointer () должна быть той функцией, которую вы ищете. GL_TRUE для периметральных сегментов, GL_FALSE для четырехугольных диагоналей.

Не забудьте glEnableClientState (GL_EDGE_FLAG_ARRAY).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...