Как преобразовать нормали к вершинам в нормали к полигону в шейдере

Рейтинг: 0Ответов: 2Опубликовано: 08.05.2023

В вертексный шейдер мне поступают нормали к вершинам объекта и когда я передаю эти нормали в фрагментный шейдер, используя метод освещения Фонга, объект получается плавно освещён введите сюда описание изображения Но мне нужно сделать режим освещения, в котором полигоны будут освещены так, чтобы полигон был одного, сплошного цвета, для понимания, я хочу сделать максимально простое освещение как в режиме редактора Blender 3D.введите сюда описание изображения Я понимаю что нужно просто сложить 3 нормали полигона и нормализировать, но проблема в том что я не могу обратиться сразу к этим трём нормалям из вершинного шейдера. Вот и возникает вопрос: Можно ли как-то реализовать автоматический подсчёт нормали к полигону, из нормалей к вершинам в шейдерах. Вести подсчёт заранее не вариант, так как я использую glDrawElements.

Ответы

▲ 1

Вертексный шейдер:

  (...)
  viewPosition = (model * vec4(aVer, 1.0)).xyz;
  (...)

Фрагментный шейдер:

  (...)
  vec3 xTangent = dFdx( viewPosition );
  vec3 yTangent = dFdy( viewPosition );
  norm = normalize( cross( xTangent, yTangent ) )
  (...)

введите сюда описание изображения

▲ 0

Нет, это не сработает. Даже если как-то извратиться и усреднить, то всё равно средняя нормаль одного треугольника и другого на 1 стороне куба будут разными.

Так что лучше всего передавайте по классике - по 1 нормали на каждую вершину каждого треугольника.