В чем разница между штриховкой Фонга и штриховкой Гуро?

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

Однако, когда я попытался вычислить цвет света математически, я пришел к одной и той же формуле для обоих способов!

рисунок, который я рисую для этого

(Где n1 и n2 - нормали двух вершин, t - коэффициент для интерполяции, L - направление света, а плоскость сверху и пунктирная линия означают экран и пиксель.)

Светлые цвета для двух методов определяются как:

  • Гуро: L = t*dot(n1,L) + (1-t)*dot(n2,L)

  • Фонг: L = dot(t*n1+(1-t)*n2,L)

и результаты такие же.

Может ли кто-нибудь сказать мне, что не так с моими производными?

1 ответ

Решение

В то время как при затенении по Гуро свет рассчитывается для каждой вершины (вершинный шейдер), при затенении Фонга свет рассчитывается для каждого фрагмента (фрагментный шейдер).
Следовательно, затенение по Гуро вычисляет свет для вершин (углов) примитива и интерполирует свет для фрагментов, покрытых примитивом.
При штриховке Фонга свет рассчитывается отдельно для каждого фрагмента.

Как правило, свет рассчитывается с помощью функции распределения двунаправленной отражательной способности. Функция вычисляет коэффициент отражения света от поверхности и зависит от вектора падающего света, точки обзора и вектора нормали к поверхности.
При штриховке по Гуро цвет вершины (отражательная способность) интерполируется, а при штриховке Фонга интерполируются 3 вектора. Это не будет иметь никакого значения, если функция c = brdf(l, v, n) является линейной, где c - цвет, l - направление света, v - вектор обзора, а n - вектор нормали (например, коэффициент отражения Ламберта). Но если модель освещения не является линейной (например, Блинна – Фонга), то линейная интерполяция затенения Гуро приводит к другим результатам.

Сравните затенение Гуро и затенение Фонга


См. Также:
Замена программы фрагмента фиксированной функции GLSL
Затенение Фонга и Гуро Затенение
Гуро / Затенение Фонга

Другие вопросы по тегам