В OpenGL 2.1 я передаю позицию и вектор нормали своему вершинному шейдеру.Затем вершинный шейдер устанавливает varying
на вектор нормали, поэтому теоретически он линейно интерполирует нормали по каждому треугольнику.(Как я понимаю, это основа затенения Фонга.)
В фрагментном шейдере я использую нормаль с законом Ламберта для вычисления диффузного отражения.Это работает, как и ожидалось, за исключением того, что интерполяция между вершинами выглядит забавно.В частности, я вижу эффект звездообразования, в котором есть заметные «горячие точки» по краям между вершинами.
Вот пример, не из моего собственного рендеринга, а демонстрирующий точно такой же эффект (см. Золотую сферуна полпути вниз по странице): http://pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php?n=CPSC453W11.Lab12
Википедия говорит: это проблема с затенением Гауро.Но насколько я понимаю, интерполируя нормали и выполняя расчеты освещения для каждого фрагмента, я использую модель Фонга, а не Гуро.Это правильно?
Если бы я использовал гораздо более мелкую сетку, я предполагаю, что эти звездные всплески были бы гораздо менее заметны.Но является ли добавление большего количества треугольников единственным способом решения этой проблемы?Я думаю, что был бы способ получить плавную интерполяцию без эффекта звездообразования.(Я, конечно, видел совершенно плавное затенение на грубых сетках в других местах, например, в 3D Studio Max. Но, возможно, они делают что-то более сложное, чем просто интерполяция нормалей.)