ChunkAnyHit.hlsl 2.4 KB

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