OpenGL: проблема с треугольными полосками для 3d-сетки и нормалей - PullRequest
8 голосов
/ 31 мая 2011

Я новичок в программировании opengl.В настоящее время я делаю анимацию формирования пещерного вала.У меня есть набор координат для профилей вала вдоль оси Z.Мой план состоит в том, чтобы сделать трехмерную сетку из этих данных, и я решил использовать TRIANGLE_STRIPS.Я сделал так, что создал несколько полос вроде этого:

 11----12 5------6
 |   /  | |   /  |
 |  /   | |  /   |
 9-----10 3------4
 |   /  | |   /  |
 |  /   | |  /   |
 7------8 1------2

Мои вопросы:

  1. Это правильный способ сделать это?Потому что сейчас у меня проблемы с нормалями.Я хотел бы использовать заливку GL_SMOOTH, и для этого, как я понимаю, мне нужно вычислить нормали вершин?Но в моем cas вершины 10 и 3 одинаковы, так что было бы две нормали ???Это проблема?И есть ли другой способ создать несколько полос?

  2. И есть ли другой способ создать несколько полос?Или решение с полосками может быть не лучшим?

  3. Другая проблема состоит в том, что эти полосы не имеют одинаковую длину.Некоторые короче других.Спасибо за помощь :)

Ответы [ 2 ]

6 голосов
/ 01 июня 2011

Во-первых, не используйте треугольные полосы.Это и старая концепция старого оборудования.Используйте простые индексированные списки треугольников.Это проще (сначала) и быстрее.На ваши вопросы:

1) Каждая вершина имеет нормаль.Это так же уникально и важно, как и позиция.Если бы две вершины имели разную позицию, это были бы разные вершины.То же самое относится к нормалям: есть вершины с одинаковым положением, но с разными нормалями.Но это разные вершины.Подумайте о том, как вершины вне сферы отличаются от вершин куба.

2) Использовать списки (glDrawElements).Не используйте полоски.Есть оптимальные способы упорядочить эти списки для кэширования, nvidia и ati имеют множество примеров кода в своих разделах для разработчиков.

3) Пока не беспокойтесь об этом.Хорошая сетка будет иметь примерно равные площади треугольников.Индексы сортируются так, что они чаще всего попадают в кеш вершин (обычно не менее 16 записей).Полоски - это способ оптимизировать кеш вершин с двумя входами.

2 голосов
/ 31 мая 2011

Во-первых, на вашей картинке диагонали фактически перевернуты, если числа представляют порядок вершин (но это незначительная ошибка представления).

  1. Это самый простой и в большинстве случаев достаточный подход для удаления более или менее однородной сетки вершин. Вы правы, в том, что 10 и 3 нуждаются в одинаковом нормале, поэтому вам нужно дать им одинаковое нормальное значение, чтобы они горели правильно. В этом случае индексация - ваш друг. Просто используйте одну вершину для 3 и 10 (с соответствующей нормалью) и используйте индексированную треугольную полосу, где индексы 3 и 10 ссылаются на одну и ту же вершину. Это стандартный способ разрешения неоднозначностей вершин. Если вы не знаете, что я имею в виду, углубитесь в программирование на OpenGL и 3D в целом, особенно в массивы вершин и индексов.

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

  3. Они должны иметь, по крайней мере, разумную длину по сравнению с общим числом треугольников, в противном случае накладные расходы на рисование одной полосы просто перевешивают время, потраченное на немного более быструю обработку вершин, но фактические числа сильно зависят от реализации. В любом случае, вы должны использовать массивы / буферы вершин, держитесь подальше от начала / конца, если вам нужна производительность.

Вы можете фактически объединить несколько полос в одну, введя вырожденные треугольники, которые не отображаются (чтобы уменьшить количество вызовов отрисовки). Ваш пример может быть представлен в виде следующей одиночной полосы:

1, 2, 3, 4, 5, 6, 6, 7 , 7, 8, 9, 10, 11, 12

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

...