glDrawElements и плоское затенение - PullRequest
10 голосов
/ 19 мая 2011

Возможно ли добиться плоского затенения в OpenGL при использовании glDrawElements для рисования объектов, и если да, то как? Идеальным способом было бы вычисление нормали для каждого треугольника только один раз, если это возможно.

Решение должно использовать только программируемый конвейер (профиль ядра).

Ответы [ 2 ]

9 голосов
/ 19 мая 2011

Действительно, есть способы обойти это без дублирования вершин, с некоторыми ограничениями для каждой из них (по крайней мере, те, которые я могу придумать из-за моего ограниченного опыта OpenGL).

Я вижу два решения, которые дадут вампостоянное значение для нормали по каждому треугольнику:

  • объявите входное значение как flat в вашем шейдере и выберите, какая вершина дает свое значение через glProvokingVertex ;быстро, но вы получите нормаль для одной вершины как нормаль для всего треугольника, который может выглядеть неправильно
  • используйте геометрический шейдер, берущий треугольники и выводящий треугольники, чтобы вычислить одну нормаль для грани.Это наиболее гибкий способ, позволяющий вам контролировать результирующий эффект, но он может быть медленным (и, конечно, требовать аппаратного обеспечения с поддержкой геометрических шейдеров)
0 голосов
/ 19 мая 2011

К сожалению, единственный способ сделать это - дублировать все ваши вершины, поскольку атрибуты для каждой вершины, а не для каждого треугольника

Когда вы думаете об этом, это то, что мы сделали в непосредственном режиме ...

...