Сделал таким образом.
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) );
Вопрос: может это можно было сделать формулой проще?
На вид все красиво и глаз радуется
Ну... круто конечно, разительно отличается... Но при изменении range никоим образом визуально не видно, что увеличивается освещаемая площадь.
Target
> при изменении range никоим образом визуально не видно, что увеличивается
> освещаемая площадь.
И не должно. Это "физически корректная" формула. Ее отличи от чистого "inverse squares" в том, что присутствует оптимизация в виде "LightRadius", без которого затухание будет стремиться к нулю бесконечно.
В реальной жизни, чтобы освещать удаленные объекты "точечным" источником света (обычной лампочкой) нужно увеличивать ее мощность. Тут ровно то же самое.
0r@ngE
> Target
> > при изменении range никоим образом визуально не видно, что увеличивается
> > освещаемая площадь.
> И не должно. Это "физически корректная" формула. Ее отличи от чистого "inverse
> squares" в том, что присутствует оптимизация в виде "LightRadius", без которого
> затухание будет стремиться к нулю бесконечно.
>
> В реальной жизни, чтобы освещать удаленные объекты "точечным" источником света
> (обычной лампочкой) нужно увеличивать ее мощность. Тут ровно то же самое.
Теперь понятно, это очень круто) Теперь появилось хоть что-то физически корректное) Спасибо за материал)
Светит слишком если увеличить яркость... Но правда и дальность освещения тоже увеличивается...
Target
> Светит слишком если увеличить яркость
Что логично, не так ли? Поэтому мы дома ставим не одну мега-мощную лампочку в центре комнаты, а несколько по периметру ;)
Логично)
Target
> Светит слишком если увеличить яркость
Юзай HDR рендеринг и тонирование:
ENAleksey
> HDR рендеринг
А каким он образом работает? Если можно)
https://learnopengl.com/Advanced-Lighting/HDR
https://gamedev.stackexchange.com/questions/12528/how-does-hdr-work
https://habr.com/post/238425/
Благодарю) Интересно)
А как "физически корректно" делается spot-light? Я попробовал сделать, как это делают стандартно не для pbr, но с теми же вычислениями что идут для PointLight (понимаю, что это в корне неверно), но все же... хотелось бы узнать.
Вот ещё хорошая ссылка по хдр тонмапам: http://filmicworlds.com/blog/filmic-tonemapping-operators/
Спотлайты по идее могут быть тысячи разных форм - всё зависит от конструкции прожектора. Многие производители ламп замеряют яркость своих продуктов на разных углах и публикуют в виде IES файлов - можно много их нагуглить. Я делал конвертер из иесов в кубмапу и потом просто домножал поинтовый свет на выборку из неё.
В принципе твой спот уже смотрится неплохо, так что можешь не париться)
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; }
Тема в архиве.