SimpleBlocksAnyHit.hlsl 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "Common.hlsl"
  2. StructuredBuffer<int> textureIdBuffer : register(t1, space2);
  3. StructuredBuffer<int> indexBuffer : register(t1, space3);
  4. StructuredBuffer<VertexData> vertexData : register(t1, space4);
  5. StructuredBuffer<int> indexOffsetBuffer : register(t1, space5);
  6. [shader("anyhit")]
  7. void SimpleBlocksAnyHit(inout HitInfo rayPayload, SimpleBlocksAttributes attrib)
  8. {
  9. if (rayPayload.hitCount < 0)
  10. { // shadow ray
  11. rayPayload.hitCount = 0;
  12. // TODO: transparent objects should lead to half shadows
  13. AcceptHitAndEndSearch();
  14. return;
  15. }
  16. int instanceId = InstanceID();
  17. int currentTriangle = PrimitiveIndex();
  18. int geometryIndex = GeometryIndex();
  19. // Bounds check for geometryIndex
  20. if (geometryIndex < 0)
  21. {
  22. IgnoreHit();
  23. return;
  24. }
  25. int textureId = textureIdBuffer[geometryIndex];
  26. Texture2D<float4> texture = textures[textureId];
  27. int indexOffset = indexOffsetBuffer[geometryIndex];
  28. int index = indexOffset + currentTriangle * 3;
  29. // Bounds check for indices
  30. if (indexBuffer[index] < 0 || indexBuffer[index + 1] < 0 || indexBuffer[index + 2] < 0)
  31. {
  32. IgnoreHit();
  33. return;
  34. }
  35. VertexData v0 = vertexData[indexBuffer[index]];
  36. VertexData v1 = vertexData[indexBuffer[index + 1]];
  37. VertexData v2 = vertexData[indexBuffer[index + 2]];
  38. float2 texcoord = v0.texcoord * (1 - attrib.bary.x - attrib.bary.y) + v1.texcoord * attrib.bary.x + v2.texcoord * attrib.bary.y;
  39. float4 color = texture.SampleLevel(gSampler, texcoord, 0);
  40. if (color.w == 0.f)
  41. {
  42. IgnoreHit();
  43. return;
  44. }
  45. float distance = RayTCurrent();
  46. bool found = false;
  47. for (int i = 0; i < rayPayload.hitCount; i++)
  48. {
  49. if (rayPayload.distance[i] > distance)
  50. {
  51. found = true;
  52. float4 tmpColor = rayPayload.color[i];
  53. rayPayload.color[i] = color;
  54. float tmpDistance = rayPayload.distance[i];
  55. rayPayload.distance[i] = distance;
  56. int tmpDayLight = rayPayload.dayLight[i];
  57. rayPayload.dayLight[i] = 0xFFFFFF;
  58. int tmpDynamicLight = rayPayload.dynamicLight[i];
  59. rayPayload.dynamicLight[i] = 0xFFFFFF;
  60. if (color.w == 1.f)
  61. {
  62. rayPayload.hitCount = i + 1;
  63. }
  64. else
  65. {
  66. for (int j = i + 1; j < rayPayload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++)
  67. {
  68. float4 tmpColor2 = rayPayload.color[j];
  69. float tmpDistance2 = rayPayload.distance[j];
  70. int tmpDayLight2 = rayPayload.dayLight[j];
  71. int tmpDynamicLight2 = rayPayload.dynamicLight[j];
  72. rayPayload.color[j] = tmpColor;
  73. rayPayload.distance[j] = tmpDistance;
  74. rayPayload.dayLight[j] = tmpDayLight;
  75. rayPayload.dynamicLight[j] = tmpDynamicLight;
  76. tmpColor = tmpColor2;
  77. tmpDistance = tmpDistance2;
  78. tmpDayLight = tmpDayLight2;
  79. tmpDynamicLight = tmpDynamicLight2;
  80. }
  81. }
  82. break;
  83. }
  84. else
  85. {
  86. if (rayPayload.color[i].w == 1.f)
  87. {
  88. found = true;
  89. break;
  90. }
  91. }
  92. }
  93. if (!found && rayPayload.hitCount < MAX_TRANSPACENT_HITS)
  94. {
  95. rayPayload.color[rayPayload.hitCount] = color;
  96. rayPayload.distance[rayPayload.hitCount] = distance;
  97. rayPayload.dayLight[rayPayload.hitCount] = 0xFFFFFF;
  98. rayPayload.dynamicLight[rayPayload.hitCount] = 0xFFFFFF;
  99. rayPayload.hitCount++;
  100. }
  101. if (color.w < 1.f)
  102. {
  103. IgnoreHit();
  104. return;
  105. }
  106. }