ChunkAnyHit.hlsl 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "Common.hlsl"
  2. Texture2D<float4> textures[] : register(t0, space1);
  3. SamplerState gSampler : register(s0, space0);
  4. [shader("anyhit")]
  5. void ChunkAnyHit(inout HitInfo payload, Attributes attrib)
  6. {
  7. Texture2D<float4> texture = textures[attrib.textureId];
  8. float4 color = texture.SampleLevel(gSampler, attrib.texCoord, 0);
  9. if (color.w == 0.f)
  10. {
  11. IgnoreHit();
  12. }
  13. float distance = RayTCurrent();
  14. bool found = false;
  15. for (int i = 0; i < payload.hitCount; i++)
  16. {
  17. if (payload.distance[i] > distance)
  18. {
  19. found = true;
  20. float4 tmpColor = payload.color[i];
  21. payload.color[i] = color;
  22. float tmpDistance = payload.distance[i];
  23. payload.distance[i] = distance;
  24. if (color.w == 1.f)
  25. {
  26. payload.hitCount = i + 1;
  27. }
  28. else
  29. {
  30. for (int j = i + 1; j < payload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++)
  31. {
  32. float4 tmpColor2 = payload.color[j];
  33. float tmpDistance2 = payload.distance[j];
  34. payload.color[j] = tmpColor;
  35. payload.distance[j] = tmpDistance;
  36. tmpColor = tmpColor2;
  37. tmpDistance = tmpDistance2;
  38. }
  39. }
  40. break;
  41. }
  42. else
  43. {
  44. if (payload.color[i].w == 1.f)
  45. {
  46. found = true;
  47. break;
  48. }
  49. }
  50. }
  51. if (!found && payload.hitCount < MAX_TRANSPACENT_HITS)
  52. {
  53. payload.color[payload.hitCount] = color;
  54. payload.distance[payload.hitCount] = distance;
  55. payload.hitCount++;
  56. }
  57. if (color.w < 1.f)
  58. {
  59. IgnoreHit();
  60. }
  61. }