SimpleBlocksAnyHit.hlsl 3.2 KB

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