| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #include "Common.hlsl"
- [shader("anyhit")]
- void ChunkAnyHit(inout HitInfo rayPayload, ChunkHitAttributes attrib)
- {
- if (rayPayload.hitCount < 0)
- { // shadow ray
- rayPayload.hitCount = 0;
- // TODO: transparent objects should lead to half shadows
- AcceptHitAndEndSearch();
- return;
- }
- Texture2D<float4> texture = textures[attrib.textureId];
- float4 color = texture.SampleLevel(gSampler, attrib.texCoord, 0);
- if (color.w == 0.f)
- {
- IgnoreHit();
- return;
- }
- float distance = RayTCurrent();
- bool found = false;
- for (int i = 0; i < rayPayload.hitCount; i++)
- {
- if (rayPayload.distance[i] > distance)
- {
- found = true;
- float4 tmpColor = rayPayload.color[i];
- rayPayload.color[i] = color;
- float tmpDistance = rayPayload.distance[i];
- rayPayload.distance[i] = distance;
- int tmpDayLight = rayPayload.dayLight[i];
- rayPayload.dayLight[i] = attrib.dayLight;
- int tmpDynamicLight = rayPayload.dynamicLight[i];
- rayPayload.dynamicLight[i] = attrib.dynamicLight;
- if (color.w == 1.f)
- {
- rayPayload.hitCount = i + 1;
- }
- else
- {
- for (int j = i + 1; j < rayPayload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++)
- {
- float4 tmpColor2 = rayPayload.color[j];
- float tmpDistance2 = rayPayload.distance[j];
- int tmpDayLight2 = rayPayload.dayLight[j];
- int tmpDynamicLight2 = rayPayload.dynamicLight[j];
- rayPayload.color[j] = tmpColor;
- rayPayload.distance[j] = tmpDistance;
- rayPayload.dayLight[j] = tmpDayLight;
- rayPayload.dynamicLight[j] = tmpDynamicLight;
- tmpColor = tmpColor2;
- tmpDistance = tmpDistance2;
- tmpDayLight = tmpDayLight2;
- tmpDynamicLight = tmpDynamicLight2;
- }
- }
- break;
- }
- else
- {
- if (rayPayload.color[i].w == 1.f)
- {
- found = true;
- break;
- }
- }
- }
- if (!found && rayPayload.hitCount < MAX_TRANSPACENT_HITS)
- {
- rayPayload.color[rayPayload.hitCount] = color;
- rayPayload.distance[rayPayload.hitCount] = distance;
- rayPayload.dayLight[rayPayload.hitCount] = attrib.dayLight;
- rayPayload.dynamicLight[rayPayload.hitCount] = attrib.dynamicLight;
- rayPayload.hitCount++;
- }
- if (color.w < 1.f)
- {
- IgnoreHit();
- return;
- }
- }
|