Как Вы вычисляете угол между двумя normals в glsl?

Пришлось использовать% {DATA: электронная почта}:% {WORD: data}

6
задан David Norman 3 December 2008 в 21:50
поделиться

2 ответа

скалярное произведение между двумя векторами возвратит косинус угла (в GLSL, это - точка (a, b)). Взятие арккосинуса этого возвратит угол в радианах (в GLSL, это - acos (x)).

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

Однако для эффекта Fresnel не действительно нужен угол. Просто наличие точечного результата между векторами достаточно. Существует много приближений для эффекта Fresnel, один из самых дешевых просто использует точку непосредственно. Или обработка на квадрат ему (x*x) или повышение до некоторого другого питания.

В Вашей программе построения теней выше, похоже, что Вы просто хотите повысить точку до 5-го питания. Что-то как:

float oneMinusDot = 1.0 - dot(L, N);
float F = pow(oneMinusDot, 5.0);
11
ответ дан 8 December 2019 в 14:48
поделиться

От скалярного произведения двух векторов можно получить косинус угла между ними

cos A = DotProduct(v1, v2) / (Length(v1) * Length(v2))

Используя это, Вы не должны вычислять косинус при вычислении F. Так как Ваши векторы являются единичными векторами, например, имеют длину один, можно даже избежать подразделения.

5
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: