SimpleBlocksAnyHit.hlsl 3.3 KB

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