Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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)
Expand All @@ -230,19 +231,21 @@ 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
{
float intensityFactor = saturate(dist * light.InvRadius);
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);
}

Expand Down
4 changes: 2 additions & 2 deletions features/Raytracing/Shaders/Raytracing/Includes/Surface.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ alignas(16)
float InvRadius;
float FadeZone;
float SizeBias;
float Pad0;
float Fade;
uint16_t Type;
uint16_t Flags;
};
Expand Down
8 changes: 4 additions & 4 deletions src/Features/Raytracing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1396,16 +1396,17 @@ eastl::vector<LightLimitFix::LightData> 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<LightLimitFix::LightFlags>(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)) {
Expand Down Expand Up @@ -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;

Expand All @@ -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);
}

Expand Down
Loading