#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 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; } }