Может кто-нибудь объяснить, как этот код преобразует что-то из освещения каждой вершины в пиксель? - PullRequest
0 голосов
/ 17 сентября 2010

В учебном пособии для вершинного шейдера было выполнено вычисление диффузного значения типа

float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0);

..фрагмент шейдеразатенение ".

Как это так?Первый метод, по-видимому, в любом случае выполняет вычисление diffuse_value для каждого пикселя!

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

diffuse_value в первом случае вычисляется в вершинном шейдере. Так что это делается только для каждой вершины.

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

Но хуже интерполировать точку двух векторов (что эффективно делает векторное освещение). Скажем, например, что ваше есть N = + Z для всех ваших вершин и L = норма (Z-X) в одной и L = норма (Z + X) в другой.

N.L = 1/sqrt(2) for both vertices. 

Интерполяция, которая даст вам ровное освещение, тогда как на самом деле интерполяция N и L по отдельности и перенормировка даст вам ожидаемый результат - освещение, которое достигает максимума точно в середине многоугольника. (потому что интерполяция нормы (Z-X) и нормы (Z + X) даст ровно Z после нормализации).

0 голосов
/ 17 сентября 2010

Если diffuse_value вычисляется в вершинном шейдере, это означает, что он вычисляется для каждой вершины.Затем он линейно интерполируется на пиксели треугольника и подается в пиксельный шейдер.(Если у вас нет нормалей на пиксель, это все, что вы можете сделать.) Затем в пиксельном шейдере цвет многоугольника (тоже интерполированный) модулируется этим diffuse_value.

0 голосов
/ 17 сентября 2010

Хорошо ... Код в вершинном шейдере оценивается только для каждой вершины с входными значениями этой вершины.

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

По крайней мере, это мое понимание, хотя я довольно придирчив к программированию шейдеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...