Как сгенерировать нормали для VBO? - PullRequest
2 голосов
/ 19 апреля 2011

Я реализовал загрузчик файлов wavefront (OBJ) для своего приложения OpenGL, который предоставляет мне информацию о лице, текстуре и вершине. Однако, чтобы использовать освещение, мне, очевидно, нужна нормальная информация. Я знаю, что правильный способ сделать это - взять перекрестное произведение трех вершин, которые составляют треугольник, и нормализовать. Это приводит к нормальному, что вы применяете ко всем 3 вершинам правильно?

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

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

Приветствия

Крис

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Да, усреднение нормалей по лицам граней, смежных с вершиной, дает хорошие результаты.Чтобы сделать очень жесткие ребра «жесткими», вы обычно вводите ограничение угла в расчет, чтобы грани с углом> 90 (или даже более низкими) градусов не получали усредненные нормали.

Проект OSS, с которым я связан, имеет свободно доступную реализацию этого алгоритма.Он O(nlogn) и работает с совершенно уникальными вершинами (каждая грань ссылается на 3 вершины, но на каждую вершину ссылается только одна грань - объединение равных вершин вместе делается на более позднем этапе).

Если у вас полностьюотдельные вершины (т. е. каждая позиция вершины существует только один раз), это можно сделать за O(n) раз, но ограничить угол ребра для сглаживания сложнее, чем реализовать.

1 голос
/ 19 апреля 2011

Как вы можете видеть здесь OBJ поддерживает определения нормалей. Почему бы не позволить программе 3D выполнить тяжелую работу? :)

...