Skip to content

Commit 4c590d3

Browse files
committed
Spaced out bushes on the ground and reorganized SER modes branching
1 parent 1348db9 commit 4c590d3

File tree

2 files changed

+69
-47
lines changed

2 files changed

+69
-47
lines changed

Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSakuraForestSER/D3D12RaytracingSakuraForestSER.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1167,10 +1167,11 @@ void D3D12RaytracingSakuraForestSER::BuildAccelerationStructures()
11671167
{
11681168
float randomXOffset = randomOffset(gen);
11691169
float randomYOffset = randomOffsetBush(genBush);
1170+
float randomZOffset = randomOffset(gen);
11701171

11711172
float posX = x * 0.2 + randomXOffset;
11721173
float posY = 1.2f + randomYOffset;
1173-
float posZ = z * 0.2;
1174+
float posZ = z * 0.2 + randomZOffset;
11741175

11751176
D3D12_RAYTRACING_INSTANCE_DESC desc = {};
11761177
float scale = 2.1f; // Bush scale

Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSakuraForestSER/Raytracing.hlsl

Lines changed: 67 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,76 @@ inline void GenerateCameraRay(uint2 index, out float3 origin, out float3 directi
9696
direction = normalize(world.xyz - origin);
9797
}
9898

99+
100+
// Helper function to configure reflection hints based on material properties
101+
void ConfigureReflectionHints(in HitObject hit, in float3 origin, in float3 rayDir, inout RayPayload payload)
102+
{
103+
// Only process hints for material-based sorting modes
104+
if (g_sceneCB.sortMode != SORTMODE_BY_MATERIAL && g_sceneCB.sortMode != SORTMODE_BY_BOTH)
105+
return;
106+
107+
uint materialID = hit.LoadLocalRootTableConstant(16);
108+
109+
// Check for reflective floor material
110+
if (materialID == 0) // Floor
111+
{
112+
// Calculate floor intersection point
113+
float t = -origin.y / rayDir.y;
114+
float3 estimatedHit = origin + t * rayDir;
115+
float2 uv = frac(estimatedHit.xz);
116+
117+
// Sample texture to determine if area is reflective (dark areas)
118+
float4 texColor = TrunkTexture.SampleLevel(TrunkSampler, uv, 0);
119+
if (all(texColor.rgb < 0.1))
120+
{
121+
payload.reflectHint = 1;
122+
}
123+
}
124+
// Check for reflective cube
125+
else if (materialID == 1) // Reflective cube
126+
{
127+
payload.reflectHint = 1;
128+
}
129+
}
130+
131+
132+
// Helper function to apply thread reordering based on sort mode
133+
void ApplyThreadReordering(in HitObject hit, in RayPayload payload)
134+
{
135+
const uint numHintBits = 1;
136+
switch (g_sceneCB.sortMode)
137+
{
138+
case SORTMODE_BY_HIT:
139+
dx::MaybeReorderThread(hit);
140+
break;
141+
142+
case SORTMODE_BY_MATERIAL:
143+
dx::MaybeReorderThread(payload.reflectHint, numHintBits);
144+
break;
145+
146+
case SORTMODE_BY_BOTH:
147+
dx::MaybeReorderThread(hit, payload.reflectHint, numHintBits);
148+
break;
149+
}
150+
}
151+
99152

100153
[shader("raygeneration")]
101154
void MyRaygenShader()
102155
{
156+
// Generate primary ray from camera
103157
float3 rayDir;
104158
float3 origin;
105159
GenerateCameraRay(DispatchRaysIndex().xy, origin, rayDir);
106160

161+
// Initialize ray descriptor
107162
RayDesc ray;
108163
ray.Origin = origin;
109164
ray.Direction = rayDir;
110165
ray.TMin = 0.001;
111166
ray.TMax = 10000.0;
112167

168+
// Initialize payload
113169
RayPayload payload = { float4(0, 0, 0, 0), 0, 0 };
114170

115171
if (g_sceneCB.sortMode == SORTMODE_OFF)
@@ -121,56 +177,21 @@ void MyRaygenShader()
121177
{
122178
// SER is on
123179
HitObject hit = HitObject::TraceRay(Scene, 0, ~0, 0, 1, 0, ray, payload);
124-
125-
// Only do reflectHint/material logic when sorting by material or sort by both
126-
if (g_sceneCB.sortMode == SORTMODE_BY_MATERIAL || g_sceneCB.sortMode == SORTMODE_BY_BOTH)
127-
{
128-
uint materialID = hit.LoadLocalRootTableConstant(16);
129-
bool isFloor = (materialID == 0);
130-
bool isTransparentCube = (materialID == 1);
131-
132-
if (isFloor)
133-
{
134-
float t = -origin.y / rayDir.y;
135-
float3 estimatedHit = origin + t * rayDir;
136-
float2 uv = frac(estimatedHit.xz * 1.0);
137-
float4 texColor = TrunkTexture.SampleLevel(TrunkSampler, uv, 0);
138-
if (texColor.r < 0.1 && texColor.g < 0.1 && texColor.b < 0.1)
139-
{
140-
payload.reflectHint = 1;
141-
}
142-
}
143-
144-
if (isTransparentCube)
145-
{
146-
payload.reflectHint = 1;
147-
}
148-
}
149-
150-
uint numHintBits = 1;
151-
152-
switch (g_sceneCB.sortMode)
153-
{
154-
case SORTMODE_BY_HIT:
155-
dx::MaybeReorderThread(hit);
156-
break;
157-
case SORTMODE_BY_MATERIAL:
158-
dx::MaybeReorderThread(payload.reflectHint, numHintBits);
159-
break;
160-
case SORTMODE_BY_BOTH:
161-
dx::MaybeReorderThread(hit, payload.reflectHint, numHintBits);
162-
break;
163-
default:
164-
break;
165-
}
166-
180+
181+
// Configure reflection hints for material-based sorting
182+
ConfigureReflectionHints(hit, origin, rayDir, payload);
183+
184+
// Apply thread reordering based on sort mode
185+
ApplyThreadReordering(hit, payload);
186+
187+
// Execute the hit shader
167188
HitObject::Invoke(hit, payload);
168189
}
169-
170-
float4 color = payload.color;
171-
RenderTarget[DispatchRaysIndex().xy] = color;
190+
RenderTarget[DispatchRaysIndex().xy] = payload.color;
172191
}
173192

193+
194+
174195

175196
// Fresnel reflectance - schlick approximation.
176197
float3 FresnelReflectanceSchlick(in float3 I, in float3 N, in float3 f0)

0 commit comments

Comments
 (0)