diff --git a/features/Raytracing/Shaders/Raytracing/Includes/ColorConversions.hlsli b/features/Raytracing/Shaders/Raytracing/Includes/ColorConversions.hlsli index dddf876bf0..c7081f25a9 100644 --- a/features/Raytracing/Shaders/Raytracing/Includes/ColorConversions.hlsli +++ b/features/Raytracing/Shaders/Raytracing/Includes/ColorConversions.hlsli @@ -50,4 +50,14 @@ float3 LLTrueLinearToGamma(float3 color) { return LLON ? color : pow(abs(color), 1.0f / 2.2f); } + +float3 EmitColorToLinear(float3 color) +{ + return LLON ? (pow(abs(color), LLSETTINGS.emitColorGamma)) : color; +} + +float EmitColorMult() +{ + return LLON ? LLSETTINGS.emitColorMult : 1.0f; +} #endif \ No newline at end of file diff --git a/features/Raytracing/Shaders/Raytracing/Includes/RT/Shading.hlsli b/features/Raytracing/Shaders/Raytracing/Includes/RT/Shading.hlsli index 273efedc37..41cbc17600 100644 --- a/features/Raytracing/Shaders/Raytracing/Includes/RT/Shading.hlsli +++ b/features/Raytracing/Shaders/Raytracing/Includes/RT/Shading.hlsli @@ -163,7 +163,7 @@ float GetLightSampleWeight(Surface surface, Light light) float3 l = (light.Vector - surface.Position); float dist = length(l) * GAME_UNIT_TO_M; float atten = 1.0 / (1.0 + dist * dist); - float intensity = max(light.Color.r, max(light.Color.g, light.Color.b)); + float intensity = max(light.Color.r, max(light.Color.g, light.Color.b)) * light.Fade; return atten * intensity; } @@ -222,6 +222,7 @@ float3 EvalPointLight(in Surface surface, in BRDFContext brdfContext, in LightDa // float atten = VanillaSquaredAtten(dist, light.Radius); // float atten = InverseSquareAtten(dist * GAME_UNIT_TO_M, light.Radius * GAME_UNIT_TO_M); + float lightSourceAngle = 0.05f; float atten = 0.0f; if ((light.Flags & LightFlags::ISL) != 0) @@ -230,6 +231,8 @@ float3 EvalPointLight(in Surface surface, in BRDFContext brdfContext, in LightDa float t = saturate((light.Radius - dist) * light.FadeZone); float fastSmoothstep = t * t * (3.0f - 2.0f * t); atten = invSq * fastSmoothstep; + float size = sqrt((light.SizeBias * 2.0f) / (0.8 * 4900)); + lightSourceAngle = atan2(size, dist); } else { @@ -237,12 +240,12 @@ float3 EvalPointLight(in Surface surface, in BRDFContext brdfContext, in LightDa atten = 1.0f - intensityFactor * intensityFactor; } - float3 direct = EvalLight(l, surface, brdfContext, material) * atten * light.Color * lightWeight; + float3 direct = EvalLight(l, surface, brdfContext, material) * atten * light.Color * light.Fade * lightWeight; [branch] if (any(direct > MIN_DIFFUSE_SHADOW)) { - float3 lr = TangentToWorld(l, SampleCosineHemisphereScaled(randomSeed, 0.05f)); + float3 lr = TangentToWorld(l, SampleCosineHemisphereScaled(randomSeed, lightSourceAngle)); direct *= TraceRayShadowFinite(Scene, surface, lr, dist); } diff --git a/features/Raytracing/Shaders/Raytracing/Includes/Surface.hlsli b/features/Raytracing/Shaders/Raytracing/Includes/Surface.hlsli index 5099b826e3..446d803f89 100644 --- a/features/Raytracing/Shaders/Raytracing/Includes/Surface.hlsli +++ b/features/Raytracing/Shaders/Raytracing/Includes/Surface.hlsli @@ -82,7 +82,7 @@ struct Surface float3 emissive = emissiveTexture.SampleLevel(BaseSampler, texCoord0, 0).rgb; Albedo = albedo * material.BaseColor().rgb * vertexColor.rgb; - Emissive = emissive * material.EffectColor().rgb * material.EffectColor().a * Frame.Emissive; + Emissive = emissive * EmitColorToLinear(material.EffectColor().rgb) * material.EffectColor().a * Frame.Emissive * EmitColorMult(); Roughness = saturate(rmaos.x * material.RoughnessScale()); Metallic = saturate(rmaos.y); AO = rmaos.z; @@ -116,7 +116,7 @@ struct Surface [branch] if (material.Feature == Feature::kGlowMap) { Texture2D glowTexture = Textures[NonUniformResourceIndex(material.GlowTexture())]; - Emissive = GlowToLinear(glowTexture.SampleLevel(BaseSampler, texCoord0, 0).rgb) * material.EffectColor().rgb * material.EffectColor().a * Frame.Emissive; + Emissive = GlowToLinear(glowTexture.SampleLevel(BaseSampler, texCoord0, 0).rgb) * EmitColorToLinear(material.EffectColor().rgb) * material.EffectColor().a * Frame.Emissive * EmitColorMult(); } [branch] diff --git a/features/Raytracing/Shaders/Raytracing/Includes/Types/Light.hlsli b/features/Raytracing/Shaders/Raytracing/Includes/Types/Light.hlsli index 093c956a90..93f4805dc7 100644 --- a/features/Raytracing/Shaders/Raytracing/Includes/Types/Light.hlsli +++ b/features/Raytracing/Shaders/Raytracing/Includes/Types/Light.hlsli @@ -21,7 +21,7 @@ alignas(16) float InvRadius; float FadeZone; float SizeBias; - float Pad0; + float Fade; uint16_t Type; uint16_t Flags; }; diff --git a/src/Features/Raytracing.cpp b/src/Features/Raytracing.cpp index c51e80bc33..75d1f76c64 100644 --- a/src/Features/Raytracing.cpp +++ b/src/Features/Raytracing.cpp @@ -1396,16 +1396,17 @@ eastl::vector Raytracing::GetPointLights() auto& runtimeData = niLight->GetLightRuntimeData(); LightLimitFix::LightData light{}; - light.color = float3(runtimeData.diffuse.red, runtimeData.diffuse.green, runtimeData.diffuse.blue) * runtimeData.fade; + light.color = float3(runtimeData.diffuse.red, runtimeData.diffuse.green, runtimeData.diffuse.blue); light.lightFlags = std::bit_cast(runtimeData.ambient.red); if (isl.loaded) { isl.ProcessLight(light, bsLight, niLight); } else { light.radius = runtimeData.radius.x; + light.fade = runtimeData.fade; if (settings.LodDimmer) - light.color *= runtimeData.fade; + light.fade *= bsLight->lodDimmer; } if (!IsGlobalLight(bsLight)) { @@ -1485,6 +1486,7 @@ void Raytracing::UpdateLights() light.InvRadius = data.invRadius; light.FadeZone = data.fadeZone; light.SizeBias = data.sizeBias; + light.Fade = data.fade; light.Type = 0; light.Flags = 0; @@ -1494,8 +1496,6 @@ void Raytracing::UpdateLights() if (data.lightFlags.any(LightLimitFix::LightFlags::Linear)) light.Flags |= (1 << 1); - light.Pad0 = 0.0f; - lights.push_back(light); }