Почему происходит плавное снижение интенсивности ослабленного света? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь реализовать ослабление света в шейдере 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 - диффузный цвет
  • с является зеркальным цветом

Для простоты я игнорирую влияние ослабления на зеркальный цвет и использую некоторые встроенные коэффициенты ослабления. Как правило, я получаю правильное поведение:

enter image description here

При увеличении расстояния между источником света и объектом уменьшение интенсивности становится не плавным:

enter image description here

enter image description here

Я получаю кольца вместо градиента. Это вопрос точности с плавающей запятой? Как я могу получить плавное изменение интенсивности на всех расстояниях?

Использование шейдеров D3D 9 и HLSL модель 3.

1 Ответ

0 голосов
/ 21 января 2019

Вы столкнулись с цветной полосой .Пока вы уменьшаете интенсивность света, вы все больше и больше растягиваете градиент.Поскольку каждый цвет отображается тремя 8-битными цветовыми каналами, он имеет ограниченную точность вывода.В какой-то момент вы можете увидеть отдельные шаги между двумя цветами, когда область одного цвета становится слишком широкой, потому что ваш глаз распознает границу между двумя плоскими областями цветов, даже если они настолько близки (0, 64, 64) к(0, 63, 63).

Поскольку обычный монитор поддерживает только 24-битные цвета, единственное жизнеспособное решение на самом деле - применить дизеринг .Это разбивает плоские цветные области, добавляя шаблон шума, поэтому глаз не может так легко уловить границы.Я уверен, что поиск Google показывает некоторые интересные ссылки, как реализовать какое-то дизеринг (например, this ).

...