Нет дубликата Самый эффективный алгоритм для вычисления нормалей вершин из набора треугольников для затенения по Гуро, так как проблема обнаружения ребер не обсуждается.
Как вычислить нормали для каждой вершины в триангулированной геометрии, чтобы использовать их в шейдере Гуро для хорошего отображения, но с отслеживанием краев? Есть ли для этого бесплатное, быстрое и эффективное стандартное решение?
Мне поручили вышеупомянутую задачу исправить процедуру, которая производит видимые артефакты. Нормали должны быть входными данными для простого шейдера Гуро, чтобы «сгладить» отображаемую геометрию на согласованной грани. Подпрограмма также должна иметь возможность находить края, чтобы их можно было использовать позже в какой-либо другой части программного обеспечения и не «сглаживать».
Данные считываются из файлов .stl, которые не содержат никакой нормальной информации, поэтому все нормали граней должны быть рассчитаны с использованием координат треугольников.
Так выглядит геометрия без интерполяции:
Вот что до сих пор делает алгоритм интерполяции:
Скругленные плоскости выглядят довольно хорошо, но интерполяция серьезно не работает в тех местах, где найденный край рядом с плоской поверхностью недостаточно силен для запуска алгоритма обнаружения краев, но также недостаточно слаб, чтобы не быть видимым. Следствием этого является смещение нормали, которая распространяется по всему треугольнику (-ам).
Интересно, есть ли для этого стандартное решение, так как эта проблема должна возникать довольно часто при работе с таким типом геометрии. И даже если нет, знает ли кто-нибудь из вас общие проблемы с этой задачей и как их избежать, чтобы получить достойные результаты?
Любая помощь приветствуется!
Изменить: Об алгоритме: обнаружение края - это не только нормальный треугольник. Рассмотрим следующий пример (проблема практически такая же в 3D):
Все вершины имеют одинаковый угол, то есть 30 °. (Углы не совсем правильные, но вы поняли ...) Однако только два внешних из них должны распознаваться как край, поэтому для этого вопроса должен быть другой критерий. До сих пор я пробовал треугольник
- радиус описанной окружности
- самый длинный край
- Показатель качества треугольника GTS
который может изменять «минимальный угол», при котором два треугольника считаются имеющими общий край. Метод самой длинной кромки выглядит наиболее многообещающим (хотя и далеким от совершенства), но я думаю, что есть кое-что, что я упустил из виду ...