Skip to content

Commit 9617a7c

Browse files
committed
NRD updated to v3.7.0:
- PT: added multi-bounce delta events (reflections and refraction on glass) - PT: fixed wrong output for INF pixels in the checkerboard mode - fixed "check me" and "improve me" tests colorization (which is currently for Bistro Interior only) - set FORCE_OPAQUE for all materials except alpha-opaque - updated dependencies
1 parent e342942 commit 9617a7c

18 files changed

+584
-460
lines changed

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ if ((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") OR (CMAKE_SYSTEM_PROCESSOR MATCHE
7373
endif()
7474

7575
# Shader compilation
76-
set(NRD_USE_OCT_NORMAL_ENCODING "1" CACHE STRING "NRD_USE_OCT_NORMAL_ENCODING")
77-
set(NRD_USE_MATERIAL_ID "1" CACHE STRING "NRD_USE_MATERIAL_ID")
76+
set(NRD_NORMAL_ENCODING "2" CACHE STRING "Normal encoding variant (0-4, matches NRD_NORMAL_ENCODING from NRD)")
77+
set(NRD_ROUGHNESS_ENCODING "1" CACHE STRING "Roughness encoding variant (0-2, matches NRD_ROUGHNESS_ENCODING from NRD)")
7878

7979
if (NOT DISABLE_SHADER_COMPILATION)
8080
# Include path for DXC and FXC (used in ShaderCompilation.cmake)
@@ -167,7 +167,7 @@ target_include_directories(NRDSample PRIVATE "External/NRIFramework/Include")
167167
target_include_directories(NRDSample PRIVATE "External/NRIFramework/External/NRI/Include")
168168
target_include_directories(NRDSample PRIVATE "External/NRIFramework/External")
169169
target_include_directories(NRDSample PRIVATE "External/NRD/Include" "External/NRD/Integration")
170-
target_compile_definitions(NRDSample PRIVATE ${PLATFORM_DEFINITIONS} PROJECT_NAME=NRDSample NRD_USE_OCT_NORMAL_ENCODING=${NRD_USE_OCT_NORMAL_ENCODING})
170+
target_compile_definitions(NRDSample PRIVATE ${PLATFORM_DEFINITIONS} PROJECT_NAME=NRDSample NRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} NRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING})
171171

172172
if (NOT DISABLE_SHADER_COMPILATION)
173173
add_dependencies(NRDSample NRDSampleShaders)

External/NRD

Submodule NRD updated from 247382b to 5405b46

External/NRIFramework

ShaderCompilation.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ macro(list_hlsl_shaders HLSL_FILES HEADER_FILES SHADER_FILES)
140140
add_custom_command(
141141
OUTPUT ${OUTPUT_PATH_DXBC} ${OUTPUT_PATH_DXBC}.h
142142
COMMAND ${FXC_PATH} /nologo ${ENTRY_POINT} /T ${FXC_PROFILE} /WX /O3
143-
/DCOMPILER_FXC=1 /DNRD_USE_OCT_NORMAL_ENCODING=${NRD_USE_OCT_NORMAL_ENCODING} /DNRD_USE_MATERIAL_ID=${NRD_USE_MATERIAL_ID}
143+
/DCOMPILER_FXC=1 /DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} /DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
144144
/I "${EXTERNAL_INCLUDE_PATH}" /I "${SHADER_INCLUDE_PATH}" /I "${MATHLIB_INCLUDE_PATH}" /I "Include"
145145
${FILE_NAME} /Vn g_${BYTECODE_ARRAY_NAME}_dxbc /Fh ${OUTPUT_PATH_DXBC}.h /Fo ${OUTPUT_PATH_DXBC}
146146
MAIN_DEPENDENCY ${FILE_NAME}
@@ -156,7 +156,7 @@ macro(list_hlsl_shaders HLSL_FILES HEADER_FILES SHADER_FILES)
156156
add_custom_command(
157157
OUTPUT ${OUTPUT_PATH_DXIL} ${OUTPUT_PATH_DXIL}.h
158158
COMMAND ${DXC_PATH} ${ENTRY_POINT} -T ${DXC_PROFILE} -WX -O3 -enable-16bit-types
159-
-DCOMPILER_DXC=1 -DNRD_USE_OCT_NORMAL_ENCODING=${NRD_USE_OCT_NORMAL_ENCODING} -DNRD_USE_MATERIAL_ID=${NRD_USE_MATERIAL_ID}
159+
-DCOMPILER_DXC=1 -DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} -DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
160160
-I "${EXTERNAL_INCLUDE_PATH}" -I "${SHADER_INCLUDE_PATH}" -I "${MATHLIB_INCLUDE_PATH}" -I "Include"
161161
${FILE_NAME} -Vn g_${BYTECODE_ARRAY_NAME}_dxil -Fh ${OUTPUT_PATH_DXIL}.h -Fo ${OUTPUT_PATH_DXIL}
162162
MAIN_DEPENDENCY ${FILE_NAME}
@@ -172,7 +172,7 @@ macro(list_hlsl_shaders HLSL_FILES HEADER_FILES SHADER_FILES)
172172
add_custom_command(
173173
OUTPUT ${OUTPUT_PATH_SPIRV} ${OUTPUT_PATH_SPIRV}.h
174174
COMMAND ${DXC_SPIRV_PATH} ${ENTRY_POINT} -T ${DXC_PROFILE} -WX -O3 -enable-16bit-types
175-
-DCOMPILER_DXC=1 -DVULKAN=1 -DNRD_USE_OCT_NORMAL_ENCODING=${NRD_USE_OCT_NORMAL_ENCODING} -DNRD_USE_MATERIAL_ID=${NRD_USE_MATERIAL_ID}
175+
-DCOMPILER_DXC=1 -DVULKAN=1 -DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} -DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
176176
-I "${EXTERNAL_INCLUDE_PATH}" -I "${SHADER_INCLUDE_PATH}" -I "${MATHLIB_INCLUDE_PATH}" -I "Include"
177177
${FILE_NAME} -spirv -Vn g_${BYTECODE_ARRAY_NAME}_spirv -Fh ${OUTPUT_PATH_SPIRV}.h -Fo ${OUTPUT_PATH_SPIRV} ${DXC_VK_SHIFTS}
178178
-spirv -fspv-target-env=vulkan1.2 -fspv-extension=SPV_EXT_descriptor_indexing -fspv-extension=KHR

Shaders/AmbientRays.cs.hlsl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ void main( uint2 tilePos : SV_GroupId, uint2 pixelPos : SV_DispatchThreadId, uin
4545
mipAndCone = GetConeAngleFromRoughness( geometryProps.mip, 1.0 );
4646

4747
float3 BRDF = GetAmbientBRDF( geometryProps, materialProps, true );
48-
BRDF *= float( !geometryProps.IsSky() );
4948

5049
// Accumulate bounces not handled by the main tracer
5150
float3 Lsum = 0.0;
@@ -70,7 +69,6 @@ void main( uint2 tilePos : SV_GroupId, uint2 pixelPos : SV_DispatchThreadId, uin
7069

7170
// Update BRDF
7271
BRDF *= GetAmbientBRDF( geometryProps, materialProps, true );
73-
BRDF *= float( !geometryProps.IsSky() );
7472
}
7573

7674
Lsum /= STL::ImportanceSampling::Uniform::GetPDF( );

Shaders/Composition.cs.hlsl

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ NRI_RESOURCE( Texture2D<float>, gIn_Downsampled_ViewZ, t, 1, 1 );
1616
NRI_RESOURCE( Texture2D<float4>, gIn_Normal_Roughness, t, 2, 1 );
1717
NRI_RESOURCE( Texture2D<float4>, gIn_BaseColor_Metalness, t, 3, 1 );
1818
NRI_RESOURCE( Texture2D<float3>, gIn_DirectLighting, t, 4, 1 );
19-
NRI_RESOURCE( Texture2D<float3>, gIn_Ambient, t, 5, 1 );
20-
NRI_RESOURCE( Texture2D<float4>, gIn_Diff, t, 6, 1 );
21-
NRI_RESOURCE( Texture2D<float4>, gIn_Spec, t, 7, 1 );
19+
NRI_RESOURCE( Texture2D<float3>, gIn_TransparentLighting, t, 5, 1 );
20+
NRI_RESOURCE( Texture2D<float3>, gIn_Ambient, t, 6, 1 );
21+
NRI_RESOURCE( Texture2D<float4>, gIn_Diff, t, 7, 1 );
22+
NRI_RESOURCE( Texture2D<float4>, gIn_Spec, t, 8, 1 );
2223

2324
#if( NRD_MODE == SH )
24-
NRI_RESOURCE( Texture2D<float4>, gIn_DiffSh, t, 8, 1 );
25-
NRI_RESOURCE( Texture2D<float4>, gIn_SpecSh, t, 9, 1 );
25+
NRI_RESOURCE( Texture2D<float4>, gIn_DiffSh, t, 9, 1 );
26+
NRI_RESOURCE( Texture2D<float4>, gIn_SpecSh, t, 10, 1 );
2627
#endif
2728

2829
// Outputs
@@ -64,6 +65,14 @@ float2 GetUpsampleUv( float2 pixelUv, float zReal )
6465
return uv;
6566
}
6667

68+
float3 AddTransparentLighting( float3 Lsum, float3 Ltransparent )
69+
{
70+
float mask = dot( Ltransparent, 1.0 );
71+
Lsum = mask == 0.0 ? Lsum : Ltransparent;
72+
73+
return Lsum;
74+
}
75+
6776
[numthreads( 16, 16, 1)]
6877
void main( int2 pixelPos : SV_DispatchThreadId )
6978
{
@@ -76,6 +85,7 @@ void main( int2 pixelPos : SV_DispatchThreadId )
7685

7786
// Early out - sky
7887
float3 Ldirect = gIn_DirectLighting[ pixelPos ];
88+
float3 Ltransparent = gIn_TransparentLighting[ pixelPos ];
7989
float viewZ = gIn_ViewZ[ pixelPos ];
8090

8191
float4 normalAndRoughness = NRD_FrontEnd_UnpackNormalAndRoughness( gIn_Normal_Roughness[ pixelPos ] );
@@ -89,7 +99,7 @@ void main( int2 pixelPos : SV_DispatchThreadId )
8999
{
90100
Ldirect *= float( gOnScreen == SHOW_FINAL );
91101

92-
gOut_Composed[ pixelPos ] = float4( Ldirect, z );
102+
gOut_Composed[ pixelPos ] = float4( AddTransparentLighting( Ldirect, Ltransparent ), z );
93103
gOut_ComposedDiff[ pixelPos ] = float4( 0, 0, 0, z );
94104
gOut_ComposedSpec[ pixelPos ] = float4( 0, 0, 0, z );
95105

@@ -189,6 +199,7 @@ void main( int2 pixelPos : SV_DispatchThreadId )
189199
Lspec += ambient * spec.w * Fenv * specAmbientAmount;
190200

191201
float3 Lsum = Ldirect + Ldiff + Lspec;
202+
Lsum = AddTransparentLighting( Lsum, Ltransparent );
192203

193204
// Debug
194205
if( gOnScreen == SHOW_DENOISED_DIFFUSE )
@@ -214,6 +225,6 @@ void main( int2 pixelPos : SV_DispatchThreadId )
214225

215226
// Output
216227
gOut_Composed[ pixelPos ] = float4( Lsum, z );
217-
gOut_ComposedDiff[ pixelPos ] = float4( Ldiff, z );
228+
gOut_ComposedDiff[ pixelPos ] = float4( Ldirect + Ldiff, z );
218229
gOut_ComposedSpec[ pixelPos ] = float4( Lspec, z );
219230
}

Shaders/DirectLighting.cs.hlsl

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ license agreement from NVIDIA CORPORATION is strictly prohibited.
1313
// Inputs
1414
NRI_RESOURCE( Texture2D<float3>, gIn_DirectEmission, t, 0, 1 );
1515
NRI_RESOURCE( Texture2D<float4>, gIn_Shadow, t, 1, 1 );
16-
NRI_RESOURCE( Texture2D<float4>, gIn_TransparentLayer, t, 2, 1 );
1716

1817
// Outputs
19-
NRI_RESOURCE( RWTexture2D<float3>, gInOut_DirectLighting, u, 3, 1 );
18+
NRI_RESOURCE( RWTexture2D<float3>, gInOut_DirectLighting, u, 0, 1 );
2019

2120
[numthreads( 16, 16, 1)]
2221
void main( int2 pixelPos : SV_DispatchThreadId )
@@ -40,10 +39,6 @@ void main( int2 pixelPos : SV_DispatchThreadId )
4039
else if( gOnScreen >= SHOW_MESH )
4140
Lsum = Ldirect;
4241

43-
// Transparent layer ( reference mode )
44-
float4 transparentLayer = ( gTransparent && gReference ) ? gIn_TransparentLayer[ pixelPos ] : 0;
45-
Lsum = Lsum * ( 1.0 - transparentLayer.w ) * ( transparentLayer.w != 0.0 ? GLASS_TINT : 1.0 ) + transparentLayer.xyz;
46-
4742
// Output
4843
gInOut_DirectLighting[ pixelPos ] = Lsum;
4944
}

Shaders/Include/RaytracingShared.hlsli

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ NRI_RESOURCE( Texture2D<float4>, gIn_Textures[], t, 4, 2 );
4444
#define FLAG_EMISSION 0x04
4545
#define FLAG_FORCED_EMISSION 0x08
4646

47-
// Local flags
48-
#define FLAG_BACKFACE 0x10
49-
#define FLAG_UNUSED1 0x20
50-
#define FLAG_UNUSED2 0x40
51-
#define FLAG_UNUSED3 0x80
47+
// Local flags // TODO: all unused
48+
#define FLAG_UNUSED1 0x10
49+
#define FLAG_UNUSED2 0x20
50+
#define FLAG_UNUSED3 0x40
51+
#define FLAG_UNUSED4 0x80
5252

5353
#define GEOMETRY_ALL ( FLAG_OPAQUE_OR_ALPHA_OPAQUE | FLAG_EMISSION | FLAG_FORCED_EMISSION | FLAG_TRANSPARENT )
5454
#define GEOMETRY_ONLY_EMISSIVE ( FLAG_EMISSION | FLAG_FORCED_EMISSION )
@@ -75,7 +75,7 @@ float3 _GetXoffset( float3 X, float3 offsetDirection )
7575
return X;// + offsetDirection * ( 0.003 + length( X - gCameraOrigin ) * 0.0005 );
7676
}
7777

78-
struct GeometryProps // TODO: half
78+
struct GeometryProps
7979
{
8080
float3 X;
8181
float3 rayDirection;
@@ -100,9 +100,6 @@ struct GeometryProps // TODO: half
100100
bool IsForcedEmission( )
101101
{ return ( textureOffsetAndFlags & ( ( FLAG_FORCED_EMISSION ) << FLAG_FIRST_BIT ) ) != 0; }
102102

103-
bool IsBackFace( )
104-
{ return ( textureOffsetAndFlags & ( ( FLAG_BACKFACE ) << FLAG_FIRST_BIT ) ) != 0; }
105-
106103
uint GetBaseTexture( )
107104
{ return textureOffsetAndFlags & INSTANCE_ID_MASK; }
108105

@@ -116,7 +113,7 @@ struct GeometryProps // TODO: half
116113
{ return tmin == INF; }
117114
};
118115

119-
struct MaterialProps // TODO: half
116+
struct MaterialProps
120117
{
121118
float3 Ldirect; // unshadowed
122119
float3 Lemi;
@@ -282,20 +279,43 @@ float3 GetAmbientBRDF( GeometryProps geometryProps, MaterialProps materialProps,
282279
float3 albedo, Rf0;
283280
STL::BRDF::ConvertBaseColorMetalnessToAlbedoRf0( materialProps.baseColor, materialProps.metalness, albedo, Rf0 );
284281

285-
float3 ambBRDF;
282+
float3 Fenv = Rf0;
286283
if( !approximate )
287284
{
288285
float NoV = abs( dot( materialProps.N, -geometryProps.rayDirection ) );
289-
float3 Fenv = STL::BRDF::EnvironmentTerm_Ross( Rf0, NoV, materialProps.roughness );
290-
291-
ambBRDF = albedo * ( 1.0 - Fenv ) + Fenv;
286+
Fenv = STL::BRDF::EnvironmentTerm_Ross( Rf0, NoV, materialProps.roughness );
292287
}
293-
else
294-
ambBRDF = albedo * ( 1.0 - Rf0 ) + Rf0;
288+
289+
float3 ambBRDF = albedo * ( 1.0 - Fenv ) + Fenv;
290+
ambBRDF *= float( !geometryProps.IsSky() );
295291

296292
return ambBRDF;
297293
}
298294

295+
float EstimateDiffuseProbability( GeometryProps geometryProps, MaterialProps materialProps, bool useMagicBoost = false )
296+
{
297+
float3 albedo, Rf0;
298+
STL::BRDF::ConvertBaseColorMetalnessToAlbedoRf0( materialProps.baseColor, materialProps.metalness, albedo, Rf0 );
299+
300+
float smc = GetSpecMagicCurve( materialProps.roughness );
301+
float NoV = abs( dot( materialProps.N, -geometryProps.rayDirection ) );
302+
float3 Fenv = STL::BRDF::EnvironmentTerm_Ross( Rf0, NoV, materialProps.roughness );
303+
304+
float lumSpec = STL::Color::Luminance( Fenv );
305+
float lumDiff = STL::Color::Luminance( albedo * ( 1.0 - Fenv ) );
306+
307+
// Boost diffuse if roughness is high
308+
if( useMagicBoost )
309+
{
310+
lumDiff = lerp( lumDiff, 1.0, smc );
311+
lumSpec = lerp( lumSpec, 0.0, smc );
312+
}
313+
314+
float diffProb = lumDiff / ( lumDiff + lumSpec + 1e-6 );
315+
316+
return diffProb;
317+
}
318+
299319
//====================================================================================================================================
300320
// TRACER
301321
//====================================================================================================================================

Shaders/Include/Shared.hlsli

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ NRI_RESOURCE( SamplerState, gLinearSampler, s, 2, 0 );
134134
NRI_RESOURCE( SamplerState, gNearestSampler, s, 3, 0 );
135135

136136
//=============================================================================================
137-
// DENOISER PART
137+
// NRD
138138
//=============================================================================================
139139

140140
#define NRD_HEADER_ONLY
@@ -149,7 +149,7 @@ NRI_RESOURCE( SamplerState, gNearestSampler, s, 3, 0 );
149149
#define USE_SIMPLEX_LIGHTING_MODEL 0
150150
#define USE_IMPORTANCE_SAMPLING 1
151151
#define USE_SANITIZATION 0 // NRD sample is NAN/INF free
152-
#define USE_SIMULATED_MATERIAL_ID_TEST 0 // for NRD_USE_MATERIAL_ID support debugging
152+
#define USE_SIMULATED_MATERIAL_ID_TEST 0 // for "material ID" support debugging
153153

154154
#define BRDF_ENERGY_THRESHOLD 0.003
155155
#define AMBIENT_FADE ( -0.001 * gUnitToMetersMultiplier * gUnitToMetersMultiplier )
@@ -159,7 +159,8 @@ NRI_RESOURCE( SamplerState, gNearestSampler, s, 3, 0 );
159159
#define TAA_MOTION_MAX_REUSE 0.1
160160
#define MAX_MIP_LEVEL 11.0
161161
#define IMPORTANCE_SAMPLE_NUM 16
162-
#define GLASS_TINT float3( 0.9, 0.9, 1.0 )
162+
#define GLASS_THICKNESS 0.003 // m
163+
#define GLASS_TINT float3( 0.95, 0.95, 0.99 )
163164

164165
//=============================================================================================
165166
// CONSTANTS
@@ -218,36 +219,29 @@ float GetSpecMagicCurve( float roughness )
218219
return f;
219220
}
220221

221-
float3 ApplyPostLightingComposition( uint2 pixelPos, float3 Lsum, Texture2D<float4> gIn_TransparentLayer, bool convertToLDR = true )
222+
// IMPORTANT: requires STL::Rng::Initialize
223+
float3 ApplyExposure( float3 Lsum, bool convertToLDR = true )
222224
{
223-
// Transparent layer ( non-reference mode )
224-
float4 transparentLayer = ( gTransparent && !gReference ) ? gIn_TransparentLayer[ pixelPos ] : 0;
225-
Lsum = Lsum * ( 1.0 - transparentLayer.w ) * ( transparentLayer.w != 0.0 ? GLASS_TINT : 1.0 ) + transparentLayer.xyz;
226-
227225
// Exposure
228226
if( gOnScreen <= SHOW_DENOISED_SPECULAR )
229227
{
230228
Lsum *= gExposure;
231229

232230
// Dithering
233-
// IMPORTANT: requires STL::Rng::Initialize
234231
float rnd = STL::Rng::GetFloat2( ).x;
235232
float luma = STL::Color::Luminance( Lsum );
236233
float amplitude = lerp( 0.4, 1.0 / 1024.0, STL::Math::Sqrt01( luma ) );
237234
float dither = 1.0 + ( rnd - 0.5 ) * amplitude;
238235
Lsum *= dither;
239236
}
240237

241-
if( convertToLDR )
242-
{
243-
// Tonemap
244-
if( gOnScreen == SHOW_FINAL )
245-
Lsum = STL::Color::HdrToLinear_Uncharted( Lsum );
238+
// Tonemap
239+
if( convertToLDR && gOnScreen == SHOW_FINAL )
240+
Lsum = STL::Color::HdrToLinear_Uncharted( Lsum );
246241

247-
// Conversion
248-
if( gOnScreen == SHOW_FINAL || gOnScreen == SHOW_BASE_COLOR )
249-
Lsum = STL::Color::LinearToSrgb( Lsum );
250-
}
242+
// Conversion
243+
if( convertToLDR && ( gOnScreen == SHOW_FINAL || gOnScreen == SHOW_BASE_COLOR ) )
244+
Lsum = STL::Color::LinearToSrgb( Lsum );
251245

252246
return Lsum;
253247
}

0 commit comments

Comments
 (0)