直接光:
Scene:Lights:DirectLighting:InjectTranslucencyVolume
TranslucentLightInjectionShaders.usf
void InjectMainPS(
FWriteToSliceGeometryOutput Input,
out float4 OutColor0 : SV_Target0,
out float4 OutColor1 : SV_Target1
)
{
OutColor0 = 0;
OutColor1 = 0;
float3 TranslatedWorldPosition;
{
float ZPosition = View_TranslucencyLightingVolumeMin[VolumeCascadeIndex].z + (Input.LayerIndex + .5f) * View_TranslucencyLightingVolumeInvSize[VolumeCascadeIndex].w;
TranslatedWorldPosition = float3(View_TranslucencyLightingVolumeMin[VolumeCascadeIndex].xy + Input.Vertex.UV / View_TranslucencyLightingVolumeInvSize[VolumeCascadeIndex].xy - .5f * View_TranslucencyLightingVolumeInvSize[VolumeCascadeIndex].w, ZPosition);
}
float3 WorldPosition = TranslatedWorldPosition - LWCToFloat( GetPrimaryView() .PreViewTranslation) ;
float3 VolumeUVs = float3(Input.Vertex.UV, (Input.LayerIndex + .5f) * View_TranslucencyLightingVolumeMin[VolumeCascadeIndex].w);
float Masking = 1.0f;
{
float3 LightVector = DeferredLightUniforms_TranslatedWorldPosition - TranslatedWorldPosition;
clip(1.0f / (DeferredLightUniforms_InvRadius * DeferredLightUniforms_InvRadius) - dot(LightVector, LightVector));
}
float3 NormalizedLightVector = GetNormalizedLightVector(TranslatedWorldPosition);
float3 TranslatedWorldPositionForLighting;
float3 WorldPositionForLighting;
{
float VoxelSize = View_TranslucencyLightingVolumeInvSize[VolumeCascadeIndex].w;
float3 LightingOffset = 1 * GetBoxPushout(NormalizedLightVector, .5f * VoxelSize);
WorldPositionForLighting = WorldPosition + LightingOffset;
TranslatedWorldPositionForLighting = TranslatedWorldPosition + LightingOffset;
}
{
float3 WorldLightVector;
float Attenuation = CalcLightAttenuation(TranslatedWorldPositionForLighting, WorldLightVector);
bool bPointLight = false;
bool bSpotLight = false;
bPointLight = SpotlightMask < 1;
bSpotLight = SpotlightMask >= 1;
bool bUnused = false;
float ShadowFactor = ComputeVolumeShadowing(TranslatedWorldPositionForLighting, bPointLight, bSpotLight, bUnused);
ShadowFactor *= GetLightFunctionShadowFactor(TranslatedWorldPositionForLighting);
if (VolumeCascadeIndex == 1)
{
float TransitionScale = 10;
float3 FadeUVs = VolumeUVs * (1 + 4 * View_TranslucencyLightingVolumeMin[VolumeCascadeIndex].w) - 2 * View_TranslucencyLightingVolumeMin[VolumeCascadeIndex].w;
float3 LerpFactors = saturate((.5f - abs(FadeUVs - .5f)) * TransitionScale);
float FinalLerpFactor = LerpFactors.x * LerpFactors.y * LerpFactors.z;
Attenuation = lerp(0, Attenuation, FinalLerpFactor);
ShadowFactor = lerp(0.0f, ShadowFactor, FinalLerpFactor);
}
float3 Lighting = DeferredLightUniforms_Color / PI * Attenuation * ShadowFactor;
FTwoBandSHVectorRGB SHLighting = MulSH(SHBasisFunction(NormalizedLightVector), Lighting);
float DirectionalLightContribution = 0;
OutColor0 = float4(SHLighting.R.V.x, SHLighting.G.V.x, SHLighting.B.V.x, DirectionalLightContribution);
float3 LuminanceWeights = float3(.3, .59, .11);
float3 Coefficient0 = float3(SHLighting.R.V.y, SHLighting.G.V.y, SHLighting.B.V.y);
float3 Coefficient1 = float3(SHLighting.R.V.z, SHLighting.G.V.z, SHLighting.B.V.z);
float3 Coefficient2 = float3(SHLighting.R.V.w, SHLighting.G.V.w, SHLighting.B.V.w);
OutColor1 = float4(dot(Coefficient0, LuminanceWeights), dot(Coefficient1, LuminanceWeights), dot(Coefficient2, LuminanceWeights), 0);
}
OutColor0 *= Masking;
OutColor1 *= Masking;
}
间接光生成:
Scene:DiffuseIndirectAndAO:TranslucencyVolumeLighting
有些复杂,后面需要再看。