Я пытаюсь реализовать ослабление света в шейдере Phong. Пиксельный / фрагментный шейдер выполняет следующие вычисления (для каждого источника света):
float3 refl = reflect(e, n);
float dist = length(L.xyz);
float3 l = normalize(L.xyz);
float attn = 1.0 / (1.0 + 1.0 / 30 * dist + 1.0 / 700 * dist * dist);
d += saturate(dot(n,l)) * gLightColor[i].xyz * attn.xxx;
s += pow(saturate(dot(-refl, l)), power) * gLightColor[i].xyz;
где:
- e - нормализованный вектор глаза
- n - нормаль к поверхности
- L - (ненормализованный) световой вектор
- d - диффузный цвет
- с является зеркальным цветом
Для простоты я игнорирую влияние ослабления на зеркальный цвет и использую некоторые встроенные коэффициенты ослабления. Как правило, я получаю правильное поведение:
При увеличении расстояния между источником света и объектом уменьшение интенсивности становится не плавным:
Я получаю кольца вместо градиента. Это вопрос точности с плавающей запятой? Как я могу получить плавное изменение интенсивности на всех расстояниях?
Использование шейдеров D3D 9 и HLSL модель 3.