ChunkAnyHit.hlsl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. int tmpDayLight = payload.dayLight[i];
  25. payload.dayLight[i] = attrib.dayLight;
  26. int tmpDynamicLight = payload.dynamicLight[i];
  27. payload.dynamicLight[i] = attrib.dynamicLight;
  28. if (color.w == 1.f)
  29. {
  30. payload.hitCount = i + 1;
  31. }
  32. else
  33. {
  34. for (int j = i + 1; j < payload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++)
  35. {
  36. float4 tmpColor2 = payload.color[j];
  37. float tmpDistance2 = payload.distance[j];
  38. int tmpDayLight2 = payload.dayLight[j];
  39. int tmpDynamicLight2 = payload.dynamicLight[j];
  40. payload.color[j] = tmpColor;
  41. payload.distance[j] = tmpDistance;
  42. payload.dayLight[j] = tmpDayLight;
  43. payload.dynamicLight[j] = tmpDynamicLight;
  44. tmpColor = tmpColor2;
  45. tmpDistance = tmpDistance2;
  46. tmpDayLight = tmpDayLight2;
  47. tmpDynamicLight = tmpDynamicLight2;
  48. }
  49. }
  50. break;
  51. }
  52. else
  53. {
  54. if (payload.color[i].w == 1.f)
  55. {
  56. found = true;
  57. break;
  58. }
  59. }
  60. }
  61. if (!found && payload.hitCount < MAX_TRANSPACENT_HITS)
  62. {
  63. payload.color[payload.hitCount] = color;
  64. payload.distance[payload.hitCount] = distance;
  65. payload.dayLight[payload.hitCount] = attrib.dayLight;
  66. payload.dynamicLight[payload.hitCount] = attrib.dynamicLight;
  67. payload.hitCount++;
  68. }
  69. if (color.w < 1.f)
  70. {
  71. IgnoreHit();
  72. }
  73. }