2015-12-23 5 views
2

При вычислении значения освещенности с использованием уравнения float intensity = clamp(dot(normal, light), 0, 1) (где light - направление экрана), в чем разница между передачей нормали к шейдеру фрагмента и вычислением его там по сравнению с выполнением вычисления в вершинном шейдере и передачей результата к фрагментному шейдеру? Я предполагаю, что вычисление его в вершинном шейдере дешевле, но я не уверен, что он влияет на результат.Есть ли разница между вычислением точечного продукта для освещения в шейдере фрагментов и вершинным шейдером?

+0

Как уже указывал полковник Тридцать Два, вычисления, которые являются линейными по всему примитиву, могут выполняться в VS без изменения общего результата. Расчеты освещения редко линейны (и точечный продукт, представляющий некоторый косинус, не является). Однако в прошлом уравнения освещения часто выполнялись на вершину, а не на фрагмент, чтобы уменьшить затраты на калькуляцию, но уменьшая качество изображения. Термины для google for - [Gouraud shading] (https://en.wikipedia.org/wiki/Gouraud_shading) и [Phong Shading] (https://en.wikipedia.org/wiki/Phong_shading). – derhass

ответ

4

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

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

+0

Я полностью согласен с основными моментами этого ответа, я просто не согласен с замечанием «(в данном случае, это)». Точечный продукт приводит к косинусу угла между (нормализованными) векторами - это не точно линейно ... В вопросе не задано, будет ли нормаль изменяться по примитиву или если считать его идеально плоским , Однако вектор «свет» должен быть вектором от рассматриваемой поверхностной точки к источнику света, и он должен меняться для каждого фрагмента, если источник света не находится бесконечно далеко, но направленный прожектор будет несколько необычным. – derhass

+0

@derhass Удален фрагмент –