ПрограммированиеФорумГрафика

Range и Intensity Point Light'a

Страницы: 1 2 Следующая »
#0
18:29, 11 сен 2018

Сделал таким образом.

float Attenuation = (
            1.0f / gPointLights[Index].Base.Intensity 
            + 
            (gPointLights[Index].Atten.Linear * Distance / gPointLights[Index].Range) 
            + 
            (gPointLights[Index].Atten.Quadratic * Distance * Distance / gPointLights[Index].Range)
          );

Вопрос: может это можно было сделать формулой проще?

На вид все красиво и глаз радуется

+ Показать
#1
18:57, 11 сен 2018

https://blog.selfshadow.com/publications/s2013-shading-course/kar… _notes_v2.pdf

UE4 Light Falloff | Range и Intensity Point Light'a
#2
19:54, 11 сен 2018

Ну... круто конечно, разительно отличается... Но при изменении range никоим образом визуально не видно, что увеличивается освещаемая площадь.

+ Показать
#3
20:04, 11 сен 2018

Target
> при изменении range никоим образом визуально не видно, что увеличивается
> освещаемая площадь.
И не должно. Это "физически корректная" формула.  Ее отличи от чистого "inverse squares" в том, что присутствует оптимизация в виде "LightRadius", без которого затухание будет стремиться к нулю бесконечно.

В реальной жизни, чтобы освещать удаленные объекты "точечным" источником света (обычной лампочкой) нужно увеличивать ее мощность. Тут ровно то же самое.

#4
20:09, 11 сен 2018

0r@ngE
> Target
> > при изменении range никоим образом визуально не видно, что увеличивается
> > освещаемая площадь.
> И не должно. Это "физически корректная" формула. Ее отличи от чистого "inverse
> squares" в том, что присутствует оптимизация в виде "LightRadius", без которого
> затухание будет стремиться к нулю бесконечно.
>
> В реальной жизни, чтобы освещать удаленные объекты "точечным" источником света
> (обычной лампочкой) нужно увеличивать ее мощность. Тут ровно то же самое.
Теперь понятно, это очень круто) Теперь появилось хоть что-то физически корректное) Спасибо за материал)

#5
20:22, 11 сен 2018

Светит слишком если увеличить яркость... Но правда и дальность освещения тоже увеличивается...
Изображение

#6
20:38, 11 сен 2018

Target
> Светит слишком если увеличить яркость
Что логично, не так ли?  Поэтому мы дома ставим не одну мега-мощную лампочку в центре комнаты, а несколько по периметру ;)

#7
20:38, 11 сен 2018

Логично)

#8
20:38, 11 сен 2018

Target
> Светит слишком если увеличить яркость
Юзай HDR рендеринг и тонирование:

+ LDR
+ HDR with Tone Mapping
#9
20:52, 11 сен 2018

ENAleksey
> HDR рендеринг
А каким он образом работает? Если можно)

#10
20:56, 11 сен 2018

https://learnopengl.com/Advanced-Lighting/HDR
https://gamedev.stackexchange.com/questions/12528/how-does-hdr-work
https://habr.com/post/238425/

#11
20:59, 11 сен 2018

Благодарю) Интересно)

#12
4:53, 12 сен 2018

А как "физически корректно" делается spot-light? Я попробовал сделать, как это делают стандартно не для pbr, но с теми же вычислениями что идут для PointLight (понимаю, что это в корне неверно), но все же... хотелось бы узнать.

+ Показать
#13
8:20, 12 сен 2018

Вот ещё хорошая ссылка по хдр тонмапам: http://filmicworlds.com/blog/filmic-tonemapping-operators/

Спотлайты по идее могут быть тысячи разных форм - всё зависит от конструкции прожектора. Многие производители ламп замеряют яркость своих продуктов на разных углах и публикуют в виде IES файлов - можно много их нагуглить. Я делал конвертер из иесов в кубмапу и потом просто домножал поинтовый свет на выборку из неё.
В принципе твой спот уже смотрится неплохо, так что можешь не париться)

#14
11:01, 12 сен 2018
float GetLightAttenuation(float3 WorldPosition, float3 CameraVector, FSimpleDeferredLightData LightData, inout float3 LightDir)
{
  float3 ToLight = LightData.LightPosition - WorldPosition;
  float DistanceSqr = dot(ToLight, ToLight);
  LightDir = ToLight * rsqrt(DistanceSqr);

  float LightMask = 1 / (DistanceSqr + 1);
  float LightRadiusMask = Square(saturate(1 - Square(DistanceSqr * Square(LightData.LightInvRadius))));
  LightMask *= LightRadiusMask;

  if (LightData.bSpotLight)
  {
    float ConeAngleFalloff = Square(saturate((dot(LightDir, LightData.LightDirection) - LightData.CosOuterCone) * LightData.InvCosConeDifference));
    LightMask *= ConeAngleFalloff;
  }

  return LightMask;
}
Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.