3 void ScaleRadiance(out float3 OutRadiance,float3 Factor,float3 Radiance){
4 OutRadiance=Factor*Radiance;
9 void ScaleAndAddRadiance(out float3 OutRadiance,
float Factor,float3 Radiance1,float3 Radiance2){
10 OutRadiance=Factor*Radiance1+Radiance2;
14 void AddRadiance(out float3 OutRadiance,float3 Radiance1,float3 Radiance2){
15 OutRadiance=Radiance1+Radiance2;
19 void ComputeSpecularLightingColor(out float3 SpecularLightingColor,float3 UsedSpecularColor,
float UnraisedSpecularIntensity,
float SpecularPower){
20 SpecularLightingColor=UsedSpecularColor*pow(UnraisedSpecularIntensity,SpecularPower);
25 void ApplyShadowIntensity(out float3 OutShadowedIrradiance,float3 Irradiance,
float ShadowIntensity){
26 OutShadowedIrradiance=Irradiance*(1.0f-ShadowIntensity);
32 void CopyWorldSpacePosition(out float3 OutWorldSpacePosition,float3 WorldSpacePosition){
33 OutWorldSpacePosition=WorldSpacePosition;
38 void NormalizeNormal(out float3 NormalizedNormal,float3 Normal){
39 NormalizedNormal=normalize(Normal);
44 void ComputeWorldSpaceViewDirection(out float3 WorldSpaceViewDirection,float3 WorldSpacePosition,float3 WorldSpaceCameraPosition){
45 WorldSpaceViewDirection=normalize(WorldSpaceCameraPosition-WorldSpacePosition);
51 void ComputeWorldSpaceViewReflectionDirection(out float3 WorldSpaceViewReflectionDirection,float3 WorldSpaceViewDirection,float3 WorldSpaceNormal){
52 WorldSpaceViewReflectionDirection=-WorldSpaceViewDirection-2.0f*dot(-WorldSpaceViewDirection,WorldSpaceNormal)*WorldSpaceNormal;
57 void ComputeCosineLobeFactor(out
float CosineLobeFactor,
float CosineLobePower){
58 const float INV_2PI=0.15915494309189533576888376337251f;
59 const float INV_PI=0.31830988618379067153776752674503;
60 CosineLobeFactor=CosineLobePower*INV_2PI+INV_PI;
66 void ComputeCosineLobeBRDF(out
float BRDFCoefficient,
float CosineLobeFactor,
float CosineLobePower,float3 WorldSpaceViewReflectionDirection,float3 IdealIncomingWorldSpaceLightDirection){
67 BRDFCoefficient=pow(max(0.0f,-dot(WorldSpaceViewReflectionDirection,IdealIncomingWorldSpaceLightDirection)),CosineLobePower)*CosineLobeFactor;
75 void ComputeTorranceSparrowConstants(out
float TorranceSparrowFactor,out
float MinFresnelTerm,out
float NormalDistributionPower,out
float SchlickSmithLerpFactor,
float CosineLobePower){
76 const float PI=3.1415926535897932384626433832795f;
78 NormalDistributionPower=CosineLobePower;
79 TorranceSparrowFactor=(NormalDistributionPower+2.0f)/(8.0f*PI);
80 SchlickSmithLerpFactor=rsqrt(0.25f*PI*NormalDistributionPower+0.5f*PI);
88 void ComputeTorranceSparrowBRDF(out
float BRDFCoefficient,
float TorranceSparrowFactor,
float MinFresnelTerm,
float NormalDistributionPower,
float SchlickSmithLerpFactor,float3 WorldSpaceViewDirection,float3 IdealIncomingWorldSpaceLightDirection,float3 WorldSpaceNormal){
90 float3 WorldSpaceHalfVector=normalize(WorldSpaceViewDirection-IdealIncomingWorldSpaceLightDirection);
92 float NormalDotLight=saturate(dot(WorldSpaceNormal,-IdealIncomingWorldSpaceLightDirection));
93 float NormalDotView=saturate(dot(WorldSpaceNormal,WorldSpaceViewDirection));
94 float NormalDotHalf=saturate(dot(WorldSpaceNormal,WorldSpaceHalfVector));
95 float HalfDotView=saturate(dot(WorldSpaceHalfVector,WorldSpaceViewDirection));
97 float NormalDistributionTerm=pow(NormalDotHalf,NormalDistributionPower);
99 float FresnelTerm=lerp(MinFresnelTerm,1.0f,exp(-6.0f*HalfDotView));
101 float VisibilityTerm=1.0f/(lerp(NormalDotLight,1.0f,SchlickSmithLerpFactor)*lerp(NormalDotView,1.0f,SchlickSmithLerpFactor));
103 BRDFCoefficient=max(0.0f,TorranceSparrowFactor*FresnelTerm*NormalDistributionTerm*VisibilityTerm);
117 void ComputeIrradianceCosineFactor(out
float IrradianceCosineFactor,float3 IdealIncomingWorldSpaceLightDirection,float3 WorldSpaceNormal){
118 IrradianceCosineFactor=max(0.0f,-dot(IdealIncomingWorldSpaceLightDirection,WorldSpaceNormal));
136 void IdealIntegrator(out float3 OutgoingRadiance,
float IrradianceCosineFactor,
float IdealBRDFCoefficient,float3 IdealIncomingIrradiance){
137 OutgoingRadiance=(IrradianceCosineFactor*IdealBRDFCoefficient)*IdealIncomingIrradiance;
149 void AmbientIntegrator(out float3 OutgoingRadiance,float3 IncomingRadiance){
150 OutgoingRadiance=IncomingRadiance;