Как преобразовать нормали к вершинам в нормали к полигону в шейдере
В вертексный шейдер мне поступают нормали к вершинам объекта и когда я передаю эти нормали в фрагментный шейдер, используя метод освещения Фонга, объект получается плавно освещён
Но мне нужно сделать режим освещения, в котором полигоны будут освещены так, чтобы полигон был одного, сплошного цвета, для понимания, я хочу сделать максимально простое освещение как в режиме редактора Blender 3D.
Я понимаю что нужно просто сложить 3 нормали полигона и нормализировать, но проблема в том что я не могу обратиться сразу к этим трём нормалям из вершинного шейдера. Вот и возникает вопрос: Можно ли как-то реализовать автоматический подсчёт нормали к полигону, из нормалей к вершинам в шейдерах. Вести подсчёт заранее не вариант, так как я использую glDrawElements.
Ответы (2 шт):
Нет, это не сработает. Даже если как-то извратиться и усреднить, то всё равно средняя нормаль одного треугольника и другого на 1 стороне куба будут разными.
Так что лучше всего передавайте по классике - по 1 нормали на каждую вершину каждого треугольника.
Вертексный шейдер:
(...)
viewPosition = (model * vec4(aVer, 1.0)).xyz;
(...)
Фрагментный шейдер:
(...)
vec3 xTangent = dFdx( viewPosition );
vec3 yTangent = dFdy( viewPosition );
norm = normalize( cross( xTangent, yTangent ) )
(...)
