ChunkAnyHit.hlsl 2.7 KB

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