Skip to content

Commit a2d711e

Browse files
HDRenderLoop: Premultiply EmissiveIntensity and EmissiveColor + few renaming
1 parent 8e8fc19 commit a2d711e

File tree

10 files changed

+44
-41
lines changed

10 files changed

+44
-41
lines changed

Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/TilePass/ClusteredUtils.hlsl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
#ifndef __CLUSTEREDUTILS_H__
22
#define __CLUSTEREDUTILS_H__
33

4-
#ifndef FLT_EPSILON
5-
#define FLT_EPSILON 1.192092896e-07f
6-
#endif
7-
84
float GetScaleFromBase(float base)
95
{
106
const float C = (float)(1 << g_iLog2NumClusters);

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Builtin/BuiltinData.hlsl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ void GetBuiltinDataDebug(uint paramId, BuiltinData builtinData, inout float3 res
7171
result = builtinData.bakeDiffuseLighting;
7272
break;
7373
case DEBUGVIEW_BUILTIN_BUILTINDATA_EMISSIVE_COLOR:
74-
result = builtinData.emissiveColor; needLinearToSRGB = true;
74+
// emissiveColor is premultiply by emissive intensity
75+
result = (builtinData.emissiveColor / builtinData.emissiveIntensity); needLinearToSRGB = true;
7576
break;
7677
case DEBUGVIEW_BUILTIN_BUILTINDATA_EMISSIVE_INTENSITY:
7778
result = builtinData.emissiveIntensity.xxx;

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Lit/Lit.hlsl

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ TEXTURE2D(_LtcGGXMatrix); // RGBA
5555
TEXTURE2D(_LtcDisneyDiffuseMatrix); // RGBA
5656
TEXTURE2D(_LtcMultiGGXFresnelDisneyDiffuse); // RGB, A unused
5757

58-
static const float3x3 _identity3x3 = {1.0, 0.0, 0.0,
59-
0.0, 1.0, 0.0,
60-
0.0, 0.0, 1.0};
61-
6258
//-----------------------------------------------------------------------------
6359
// Helper functions/variable specific to this material
6460
//-----------------------------------------------------------------------------
@@ -555,7 +551,7 @@ PreLightData GetPreLightData(float3 V, float3 positionWS, Coordinate coord, BSDF
555551
float3 GetBakedDiffuseLigthing(SurfaceData surfaceData, BuiltinData builtinData, BSDFData bsdfData, PreLightData preLightData)
556552
{
557553
// Premultiply bake diffuse lighting information with DisneyDiffuse pre-integration
558-
return builtinData.bakeDiffuseLighting * preLightData.diffuseFGD * surfaceData.ambientOcclusion * bsdfData.diffuseColor + builtinData.emissiveColor * builtinData.emissiveIntensity;
554+
return builtinData.bakeDiffuseLighting * preLightData.diffuseFGD * surfaceData.ambientOcclusion * bsdfData.diffuseColor + builtinData.emissiveColor;
559555
}
560556

561557
//-----------------------------------------------------------------------------
@@ -571,7 +567,7 @@ LighTransportData GetLightTransportData(SurfaceData surfaceData, BuiltinData bui
571567
// we want to take some of that into account too.
572568

573569
lightTransportData.diffuseColor = bsdfData.diffuseColor + bsdfData.fresnel0 * bsdfData.roughness * 0.5 * surfaceData.metallic;
574-
lightTransportData.emissiveColor = builtinData.emissiveColor * builtinData.emissiveIntensity;
570+
lightTransportData.emissiveColor = builtinData.emissiveColor;
575571

576572
return lightTransportData;
577573
}
@@ -845,7 +841,7 @@ void EvaluateBSDF_Line(LightLoopContext lightLoopContext,
845841
// Evaluate the diffuse part.
846842
{
847843
#ifdef LIT_DIFFUSE_LAMBERT_BRDF
848-
ltcValue = LTCEvaluate(P1, P2, B, _identity3x3);
844+
ltcValue = LTCEvaluate(P1, P2, B, k_identity3x3);
849845
#else
850846
ltcValue = LTCEvaluate(P1, P2, B, preLightData.ltcXformDisneyDiffuse);
851847
#endif
@@ -1008,7 +1004,7 @@ void EvaluateBSDF_Area(LightLoopContext lightLoopContext,
10081004
{
10091005
#ifdef LIT_DIFFUSE_LAMBERT_BRDF
10101006
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, lightData.twoSided,
1011-
_identity3x3);
1007+
k_identity3x3);
10121008
#else
10131009
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, lightData.twoSided,
10141010
preLightData.ltcXformDisneyDiffuse);

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Lit/LitData.hlsl

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,22 @@ void GetSurfaceAndBuiltinData(FragInput input, out SurfaceData surfaceData, out
263263
// Note that data input above can be use to sample into lightmap (like normal)
264264
builtinData.bakeDiffuseLighting = SampleBakedGI(input.positionWS, surfaceData.normalWS, input.texCoord1, input.texCoord2);
265265

266+
// Emissive Intensity is only use here, but is part of BuiltinData to enforce UI parameters as we want the users to fill one color and one intensity
267+
builtinData.emissiveIntensity = _EmissiveIntensity; // We still store intensity here so we can reuse it with debug code
268+
266269
// If we chose an emissive color, we have a dedicated texture for it and don't use MaskMap
267270
#ifdef _EMISSIVE_COLOR
268271
#ifdef _EMISSIVE_COLOR_MAP
269-
builtinData.emissiveColor = SAMPLE_TEXTURE2D(_EmissiveColorMap, sampler_EmissiveColorMap, input.texCoord0).rgb * _EmissiveColor;
272+
builtinData.emissiveColor = SAMPLE_TEXTURE2D(_EmissiveColorMap, sampler_EmissiveColorMap, input.texCoord0).rgb * _EmissiveColor * builtinData.emissiveIntensity;
270273
#else
271-
builtinData.emissiveColor = _EmissiveColor;
274+
builtinData.emissiveColor = _EmissiveColor * builtinData.emissiveIntensity;
272275
#endif
273276
#elif defined(_MASKMAP) // If we have a MaskMap, use emissive slot as a mask on baseColor
274-
builtinData.emissiveColor = surfaceData.baseColor * SAMPLE_TEXTURE2D(_MaskMap, sampler_MaskMap, input.texCoord0).bbb;
277+
builtinData.emissiveColor = surfaceData.baseColor * (SAMPLE_TEXTURE2D(_MaskMap, sampler_MaskMap, input.texCoord0).b * builtinData.emissiveIntensity).xxx;
275278
#else
276279
builtinData.emissiveColor = float3(0.0, 0.0, 0.0);
277280
#endif
278281

279-
builtinData.emissiveIntensity = _EmissiveIntensity;
280-
281282
builtinData.velocity = CalculateVelocity(input.positionCS, input.previousPositionCS);
282283

283284
builtinData.distortion = float2(0.0, 0.0);
@@ -560,6 +561,12 @@ void GetSurfaceAndBuiltinData(FragInput input, out SurfaceData surfaceData, out
560561
// Note that data input above can be use to sample into lightmap (like normal)
561562
builtinData.bakeDiffuseLighting = SampleBakedGI(input.positionWS, surfaceData.normalWS, input.texCoord1, input.texCoord2);
562563

564+
// Emissive Intensity is only use here, but is part of BuiltinData to enforce UI parameters as we want the users to fill one color and one intensity
565+
PROP_DECL(float, emissiveIntensity);
566+
PROP_ASSIGN(emissiveIntensity, _EmissiveIntensity, r);
567+
PROP_BLEND_SCALAR(emissiveIntensity, weights);
568+
builtinData.emissiveIntensity = emissiveIntensity; // We still store intensity here so we can reuse it with debug code
569+
563570
// If we chose an emissive color, we have a dedicated texture for it and don't use MaskMap
564571
PROP_DECL(float3, emissiveColor);
565572
#ifdef _EMISSIVE_COLOR
@@ -575,12 +582,7 @@ void GetSurfaceAndBuiltinData(FragInput input, out SurfaceData surfaceData, out
575582
PROP_ASSIGN_VALUE(emissiveColor, float3(0.0, 0.0, 0.0));
576583
#endif
577584
PROP_BLEND_COLOR(emissiveColor, weights);
578-
builtinData.emissiveColor = emissiveColor;
579-
580-
PROP_DECL(float, emissiveIntensity);
581-
PROP_ASSIGN(emissiveIntensity, _EmissiveIntensity, r);
582-
PROP_BLEND_SCALAR(emissiveIntensity, weights);
583-
builtinData.emissiveIntensity = emissiveIntensity;
585+
builtinData.emissiveColor = emissiveColor * builtinData.emissiveIntensity;
584586

585587
builtinData.velocity = CalculateVelocity(input.positionCS, input.previousPositionCS);
586588

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Unlit/Unlit.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ LighTransportData GetLightTransportData(SurfaceData surfaceData, BuiltinData bui
5050
LighTransportData lightTransportData;
5151

5252
lightTransportData.diffuseColor = float3(0.0, 0.0, 0.0);
53-
lightTransportData.emissiveColor = builtinData.emissiveColor * builtinData.emissiveIntensity;
53+
lightTransportData.emissiveColor = builtinData.emissiveColor;
5454

5555
return lightTransportData;
5656
}

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Unlit/UnlitData.hlsl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ void GetSurfaceAndBuiltinData(FragInput input, out SurfaceData surfaceData, out
1717

1818
builtinData.bakeDiffuseLighting = float3(0.0, 0.0, 0.0);
1919

20+
// Emissive Intensity is only use here, but is part of BuiltinData to enforce UI parameters as we want the users to fill one color and one intensity
21+
builtinData.emissiveIntensity = _EmissiveIntensity;
22+
2023
#ifdef _EMISSIVE_COLOR_MAP
21-
builtinData.emissiveColor = SAMPLE_TEXTURE2D(_EmissiveColorMap, sampler_EmissiveColorMap, input.texCoord0).rgb * _EmissiveColor;
24+
builtinData.emissiveColor = SAMPLE_TEXTURE2D(_EmissiveColorMap, sampler_EmissiveColorMap, input.texCoord0).rgb * _EmissiveColor * builtinData.emissiveIntensity;
2225
#else
23-
builtinData.emissiveColor = _EmissiveColor;
26+
builtinData.emissiveColor = _EmissiveColor * builtinData.emissiveIntensity;
2427
#endif
2528

26-
builtinData.emissiveIntensity = _EmissiveIntensity;
27-
2829
builtinData.velocity = float2(0.0, 0.0);
2930

3031
builtinData.distortion = float2(0.0, 0.0);

Assets/ScriptableRenderLoop/HDRenderLoop/ShaderPass/ShaderPassForwardUnlit.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ float4 Frag(PackedVaryings packedInput) : SV_Target
1515
BSDFData bsdfData = ConvertSurfaceDataToBSDFData(surfaceData);
1616

1717
// TODO: we must not access bsdfData here, it break the genericity of the code!
18-
return float4(bsdfData.color + builtinData.emissiveColor * builtinData.emissiveIntensity, builtinData.opacity);
18+
return float4(bsdfData.color + builtinData.emissiveColor, builtinData.opacity);
1919
}
2020

Assets/ScriptableRenderLoop/ShaderLibrary/AreaLighting.hlsl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ float LTCEvaluate(float4x3 L, float3 V, float3 N, float NdotV, bool twoSided, fl
185185
float LineFpo(float tLDDL, float lrcpD, float rcpD)
186186
{
187187
// Compute: ((l / d) / (d * d + l * l)) + (1.0 / (d * d)) * atan(l / d).
188-
return tLDDL + sq(rcpD) * atan(lrcpD);
188+
return tLDDL + Square(rcpD) * atan(lrcpD);
189189
}
190190

191191
float LineFwt(float tLDDL, float l)
@@ -204,8 +204,8 @@ float LineIrradiance(float l1, float l2, float3 normal, float3 tangent)
204204
float d = length(normal);
205205
float l1rcpD = l1 * rcp(d);
206206
float l2rcpD = l2 * rcp(d);
207-
float tLDDL1 = l1rcpD * rcp(sq(d) + sq(l1));
208-
float tLDDL2 = l2rcpD * rcp(sq(d) + sq(l2));
207+
float tLDDL1 = l1rcpD * rcp(Square(d) + Square(l1));
208+
float tLDDL2 = l2rcpD * rcp(Square(d) + Square(l2));
209209
float intWt = LineFwt(tLDDL2, l2) - LineFwt(tLDDL1, l1);
210210
float intP0 = LineFpo(tLDDL2, l2rcpD, rcp(d)) - LineFpo(tLDDL1, l1rcpD, rcp(d));
211211
return intP0 * normal.z + intWt * tangent.z;
@@ -225,7 +225,7 @@ float LTCEvaluate(float3 P1, float3 P2, float3 B, float3x3 invM)
225225
if (P2.z <= 0.0)
226226
{
227227
// Convention: 'P2' is above the horizon.
228-
swap(P1, P2);
228+
Swap(P1, P2);
229229
}
230230

231231
// Recompute the length and the tangent in the new coordinate system.

Assets/ScriptableRenderLoop/ShaderLibrary/Common.hlsl

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,27 +128,27 @@ float4 Max3(float4 a, float4 b, float4 c)
128128
}
129129
#endif // INTRINSIC_MINMAX3
130130

131-
float sq(float x)
131+
float Square(float x)
132132
{
133133
return x * x;
134134
}
135135

136-
void swap(inout float a, inout float b)
136+
void Swap(inout float a, inout float b)
137137
{
138138
float t = a; a = b; b = t;
139139
}
140140

141-
void swap(inout float2 a, inout float2 b)
141+
void Swap(inout float2 a, inout float2 b)
142142
{
143143
float2 t = a; a = b; b = t;
144144
}
145145

146-
void swap(inout float3 a, inout float3 b)
146+
void Swap(inout float3 a, inout float3 b)
147147
{
148148
float3 t = a; a = b; b = t;
149149
}
150150

151-
void swap(inout float4 a, inout float4 b)
151+
void Swap(inout float4 a, inout float4 b)
152152
{
153153
float4 t = a; a = b; b = t;
154154
}
@@ -279,6 +279,14 @@ float smoothstep01(float x)
279279
return x * x * (3.0 - (2.0 * x));
280280
}
281281

282+
const float3x3 k_identity3x3 = {1.0, 0.0, 0.0,
283+
0.0, 1.0, 0.0,
284+
0.0, 0.0, 1.0};
285+
286+
0.0, 1.0, 0.0, 0.0,
287+
0.0, 0.0, 1.0, 0.0,
288+
0.0, 0.0, 0.0, 1.0 };
289+
282290
// ----------------------------------------------------------------------------
283291
// World position reconstruction / transformation
284292
// ----------------------------------------------------------------------------

Assets/ScriptableRenderLoop/ShaderLibrary/ImageBasedLighting.hlsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ float perceptualRoughnessToMipmapLevel(float perceptualRoughness)
2121
// For now disabled
2222
#if 0
2323
float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter
24-
const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong)
25-
float n = (2.0 / max(fEps, m*m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf
24+
float n = (2.0 / max(FLT_EPSILON, m*m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf
2625

2726
n /= 4.0; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html
2827

0 commit comments

Comments
 (0)