|
|
@@ -5,18 +5,17 @@
|
|
|
void RayGen()
|
|
|
{
|
|
|
// Initialize the ray payload
|
|
|
- HitInfo rayPayload;
|
|
|
+ RayHits rayPayload;
|
|
|
rayPayload.hitCount = 0;
|
|
|
- rayPayload.color[0] = float4(0, 0, 0, 0);
|
|
|
- rayPayload.color[1] = float4(0, 0, 0, 0);
|
|
|
- rayPayload.color[2] = float4(0, 0, 0, 0);
|
|
|
- rayPayload.color[3] = float4(0, 0, 0, 0);
|
|
|
- rayPayload.color[4] = float4(0, 0, 0, 0);
|
|
|
+ SingleHit hitInitial;
|
|
|
+ hitInitial.color = float4(0, 0, 0, 0);
|
|
|
+ hitInitial.normal = float3(0, 0, 0);
|
|
|
+ hitInitial.distance = 0.f;
|
|
|
+ hitInitial.dayLight = 0;
|
|
|
+ hitInitial.dynamicLight = 0;
|
|
|
for (int index = 0; index < MAX_TRANSPACENT_HITS; index++)
|
|
|
{
|
|
|
- rayPayload.distance[index] = 0.f;
|
|
|
- rayPayload.dayLight[index] = 0;
|
|
|
- rayPayload.dynamicLight[index] = 0;
|
|
|
+ rayPayload.hits[index] = hitInitial;
|
|
|
}
|
|
|
float3 color = float3(0, 0, 0);
|
|
|
|
|
|
@@ -38,17 +37,22 @@ void RayGen()
|
|
|
ray.TMax = maxDistance;
|
|
|
TraceRay(TLAS, /*RayFlags*/0, /*InstanceInclusionMask*/0xFF, /*RayContributionToHitGroupIndex*/0,
|
|
|
/*MultiplierForGeometryContributionToHitGroupIndex*/0, /*MissShaderIndex*/0, ray, rayPayload);
|
|
|
- float3 minLight = float3(0.1f, 0.1f, 0.1f);
|
|
|
- float3 dayLight = unpackLight(rayPayload.dayLight[rayPayload.hitCount - 1]);
|
|
|
- float3 dynamicLight = unpackLight(rayPayload.dynamicLight[rayPayload.hitCount - 1]);
|
|
|
- float3 light = max(minLight, max(dynamicLight, dayLight));
|
|
|
- color = rayPayload.color[rayPayload.hitCount - 1].rgb * light;
|
|
|
- for (int i = rayPayload.hitCount - 2; i >= 0; i--)
|
|
|
+ if (rayPayload.hitCount > 0)
|
|
|
{
|
|
|
- dayLight = unpackLight(rayPayload.dayLight[i]);
|
|
|
- dynamicLight = unpackLight(rayPayload.dynamicLight[i]);
|
|
|
- light = max(minLight, max(dynamicLight, dayLight));
|
|
|
- color = rayPayload.color[i].rgb * light * rayPayload.color[i].a + color * (1 - rayPayload.color[i].a);
|
|
|
+ float3 minLight = float3(0.1f, 0.1f, 0.1f);
|
|
|
+ SingleHit lastHit = rayPayload.hits[rayPayload.hitCount - 1];
|
|
|
+ float3 dayLight = unpackLight(lastHit.dayLight);
|
|
|
+ float3 dynamicLight = unpackLight(lastHit.dynamicLight);
|
|
|
+ float3 light = max(minLight, max(dynamicLight, dayLight));
|
|
|
+ color = lastHit.color.rgb * light;
|
|
|
+ for (int i = rayPayload.hitCount - 2; i >= 0; i--)
|
|
|
+ {
|
|
|
+ SingleHit currentHit = rayPayload.hits[i];
|
|
|
+ dayLight = unpackLight(currentHit.dayLight);
|
|
|
+ dynamicLight = unpackLight(currentHit.dynamicLight);
|
|
|
+ light = max(minLight, max(dynamicLight, dayLight));
|
|
|
+ color = currentHit.color.rgb * light * currentHit.color.a + color * (1 - currentHit.color.a);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|