| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include "Common.hlsl"
- Texture2D<float4> textures[] : register(t0, space1);
- SamplerState gSampler : register(s0, space0);
- [shader("anyhit")]
- void ChunkAnyHit(inout HitInfo payload, Attributes attrib)
- {
- Texture2D<float4> texture = textures[attrib.textureId];
- float4 color = texture.SampleLevel(gSampler, attrib.texCoord, 0);
- if (color.w == 0.f)
- {
- IgnoreHit();
- }
- float distance = RayTCurrent();
- bool found = false;
- for (int i = 0; i < payload.hitCount; i++)
- {
- if (payload.distance[i] > distance)
- {
- found = true;
- float4 tmpColor = payload.color[i];
- payload.color[i] = color;
- float tmpDistance = payload.distance[i];
- payload.distance[i] = distance;
- int tmpDayLight = payload.dayLight[i];
- payload.dayLight[i] = attrib.dayLight;
- int tmpDynamicLight = payload.dynamicLight[i];
- payload.dynamicLight[i] = attrib.dynamicLight;
- if (color.w == 1.f)
- {
- payload.hitCount = i + 1;
- }
- else
- {
- for (int j = i + 1; j < payload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++)
- {
- float4 tmpColor2 = payload.color[j];
- float tmpDistance2 = payload.distance[j];
- int tmpDayLight2 = payload.dayLight[j];
- int tmpDynamicLight2 = payload.dynamicLight[j];
- payload.color[j] = tmpColor;
- payload.distance[j] = tmpDistance;
- payload.dayLight[j] = tmpDayLight;
- payload.dynamicLight[j] = tmpDynamicLight;
- tmpColor = tmpColor2;
- tmpDistance = tmpDistance2;
- tmpDayLight = tmpDayLight2;
- tmpDynamicLight = tmpDynamicLight2;
- }
- }
- break;
- }
- else
- {
- if (payload.color[i].w == 1.f)
- {
- found = true;
- break;
- }
- }
- }
- if (!found && payload.hitCount < MAX_TRANSPACENT_HITS)
- {
- payload.color[payload.hitCount] = color;
- payload.distance[payload.hitCount] = distance;
- payload.dayLight[payload.hitCount] = attrib.dayLight;
- payload.dynamicLight[payload.hitCount] = attrib.dynamicLight;
- payload.hitCount++;
- }
- if (color.w < 1.f)
- {
- IgnoreHit();
- }
- }
|