@@ -96,20 +96,76 @@ inline void GenerateCameraRay(uint2 index, out float3 origin, out float3 directi
96
96
direction = normalize (world.xyz - origin);
97
97
}
98
98
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
+
99
152
100
153
[shader ("raygeneration" )]
101
154
void MyRaygenShader ()
102
155
{
156
+ // Generate primary ray from camera
103
157
float3 rayDir;
104
158
float3 origin;
105
159
GenerateCameraRay (DispatchRaysIndex ().xy, origin, rayDir);
106
160
161
+ // Initialize ray descriptor
107
162
RayDesc ray;
108
163
ray.Origin = origin;
109
164
ray.Direction = rayDir;
110
165
ray.TMin = 0.001 ;
111
166
ray.TMax = 10000.0 ;
112
167
168
+ // Initialize payload
113
169
RayPayload payload = { float4 (0 , 0 , 0 , 0 ), 0 , 0 };
114
170
115
171
if (g_sceneCB.sortMode == SORTMODE_OFF)
@@ -121,56 +177,21 @@ void MyRaygenShader()
121
177
{
122
178
// SER is on
123
179
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
167
188
HitObject::Invoke (hit, payload);
168
189
}
169
-
170
- float4 color = payload.color;
171
- RenderTarget[DispatchRaysIndex ().xy] = color;
190
+ RenderTarget[DispatchRaysIndex ().xy] = payload.color;
172
191
}
173
192
193
+
194
+
174
195
175
196
// Fresnel reflectance - schlick approximation.
176
197
float3 FresnelReflectanceSchlick (in float3 I, in float3 N, in float3 f0)
0 commit comments