в объектном файле волнового фронта (.obj), как я должен рендерить лица с более чем 4 вершинами в OpenGL? - PullRequest
7 голосов
/ 05 февраля 2012

Итак, используя объектный файл Wavefront , как я должен рендерить грани, имеющие более 4 вершин в OpenGL?

Я понимаю, что если у него 3 вершины, я использую GL_TRIANGLES, если у него 4, я использую GL_QUADS, но если у него 5 или более, что я должен использовать?Есть ли стандарт?

Ответы [ 3 ]

8 голосов
/ 05 февраля 2012

Во-первых, вы должны указать любому инструменту экспорта не экспортировать грани с таким количеством вершин. Грани должны иметь 3 вершины, точка.

Если ваш инструмент экспорта не может этого сделать, тогда ваш инструмент загрузки должен разбить полигоны на 3 грани вершин. Я вполне уверен, что библиотека импортеров активов может это сделать.

7 голосов
/ 05 февраля 2012

OBJ экспортеры будут экспортировать вершины в правильном порядке для каждого лица (против / по часовой стрелке), и пока ваши лица копланарны и выпуклы (что должно быть кроваво!) - вы можете использовать GL_TRIANGLE_FAN.

Я не согласен с утверждением Николя Боласа о том, что у граней всегда должно быть 3 вершины, хотя безошибочно, если ваши полигоны следуют вышеуказанным правилам, использование GL_TRIANGLE_FAN упрощает ваш код и уменьшает потребление системной памяти.Ничто не изменит сторону GPU, так как полигоны все равно будут разложены на треугольники.

4 голосов
/ 08 сентября 2013

На практике большинство граней волнового фронта являются копланарными и выпуклыми, но я не могу найти ничего в оригинальной спецификации OBJ , говорящей, что это гарантировано.

Если грань копланарная и выпуклая, вы можете использовать GL_TRIANGLE_FAN или GL_TRIANGLE и вручную оценить вентилятор. Веер имеет все треугольники, разделяющие первую вершину. Как это:

// manually generate a triangle-fan
for (int x = 1; x < (faceIndicies.Length-1); x++) {
    renderIndicies.Add(faceIndicies[0]);
    renderIndicies.Add(faceIndicies[x]);
    renderIndicies.Add(faceIndicies[x+1]);
}

Если количество вершин в n-угольнике велико, использование GL_TRIANGLE_STRIP или ручное формирование собственных треугольных полос может привести к лучшим визуальным результатам. Но это очень редко встречается в OBJ-файлах wavefront.

Если грань копланарная, но вогнутая, то вам нужно триангулировать грань с помощью алгоритма, такого как метод обрезания ушей.

http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method

Если вершины не копланарны, вы ввернуты, потому что OBJ не сохраняет достаточно информации, чтобы знать, какая форма тесселяции была предназначена.

...