почему мы должны указывать координаты пространства глаза на этапе фрагмента в конвейере OpenGL? - PullRequest
9 голосов
/ 13 июля 2011

В настоящее время я программирую небольшой 3D-движок, и мне было интересно, почему я должен использовать координаты пространства глаза в шейдере фрагмента.Чтобы сделать это, я должен поместить матрицу своей камеры в униформу, чтобы преобразовать положения света в координаты глаза, и матрицу camera_normal, чтобы поместить направления света в координаты глаза.Почему все используют эти координаты?Я не вижу никакого преимущества, поэтому, если бы вы могли помочь мне понять этот выбор, я был бы благодарен.Спасибо:)

Ответы [ 2 ]

7 голосов
/ 13 июля 2011

Существует несколько причин использования глазного пространства:

  1. Это удобно. Это хорошо определенное пространство, которое существует, и которое вы все равно вычисляете на пути к трансформации позиций.
  2. Он имеет тот же масштаб, что и мировое пространство, но не имеет проблем, которые создает мировое пространство. Глазное пространство всегда (относительно) близко к нулю (поскольку глаз находится в 0), поэтому это разумное пространство для наличия явной матрицы преобразования для. Масштаб важен, потому что вы можете указать расстояния (например, условия ослабления света), которые вычисляются в мировом пространстве. Расстояния в глазном пространстве не меняются.
  3. Вам все равно нужно преобразовать его в линейное пространство. Освещение, особенно с аттенюацией, в нелинейном пространстве, таком как пространства после проекции, ... сложно. Таким образом, вам придется указывать нормали и положения в некотором линейном пространстве, так что это может быть и глазное пространство.
  4. Требуется наименьшее количество преобразований. Глазное пространство - это пространство перед трансформацией проекции. Если вам необходимо выполнить обратное преобразование в линейное пространство (например, отложенный рендеринг), пространство глаз является тем, которое требует наименьшего количества операций.
4 голосов
/ 13 июля 2011

Вам не нужно подавать матрицу камеры в шейдер и выполнять там преобразование положения и направления света. На самом деле это довольно неэффективно, так как вы снова и снова выполняете одни и те же операции над одними и теми же числами для каждой вершины.

Просто измените положение и направление источника света на процессоре и передайте готовые параметры освещения в шейдер. Однако расчеты освещения еще более кратки в глазном пространстве, особенно если используется нормальное картирование. Но вы все равно должны трансформировать все в пространство глаз, так как нормали не трансформируются перспективным преобразованием (хотя положения вершин могут быть преобразованы непосредственно в пространство клипа).

...