CustomRayGen.hlsl 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "Common.hlsl"
  2. [shader("raygeneration")]
  3. void RayGen()
  4. {
  5. // Initialize the ray payload
  6. HitInfo rayPayload;
  7. rayPayload.hitCount = 0;
  8. rayPayload.color[0] = float4(0, 0, 0, 0);
  9. rayPayload.color[1] = float4(0, 0, 0, 0);
  10. rayPayload.color[2] = float4(0, 0, 0, 0);
  11. rayPayload.color[3] = float4(0, 0, 0, 0);
  12. rayPayload.color[4] = float4(0, 0, 0, 0);
  13. for (int index = 0; index < MAX_TRANSPACENT_HITS; index++)
  14. {
  15. rayPayload.distance[index] = 0.f;
  16. rayPayload.dayLight[index] = 0;
  17. rayPayload.dynamicLight[index] = 0;
  18. }
  19. float3 color = float3(0, 0, 0);
  20. // Get the location within the dispatched 2D grid of work items
  21. // (often maps to pixels, so this could represent a pixel coordinate).
  22. float2 dispatchDimensions = float2(DispatchRaysDimensions().xy);
  23. uint2 dispatchIndex = DispatchRaysIndex().xy;
  24. float2 dispatchPercentage = (dispatchIndex + 0.5) / dispatchDimensions;
  25. if (useRays)
  26. {
  27. float2 d = (dispatchPercentage * 2.f - 1.f);
  28. RayDesc ray;
  29. ray.Origin = mul(inverseView, float4(0, 0, 0, 1)).xyz;
  30. float4 target = mul(inverseProjection, float4(d.x, -d.y, -1, 1));
  31. target.w = 1;
  32. ray.Direction = mul(inverseView, target).xyz - ray.Origin;
  33. ray.TMin = minDistance;
  34. ray.TMax = maxDistance;
  35. TraceRay(TLAS, /*RayFlags*/0, /*InstanceInclusionMask*/0xFF, /*RayContributionToHitGroupIndex*/0,
  36. /*MultiplierForGeometryContributionToHitGroupIndex*/0, /*MissShaderIndex*/0, ray, rayPayload);
  37. float3 minLight = float3(0.1f, 0.1f, 0.1f);
  38. float3 dayLight = unpackLight(rayPayload.dayLight[rayPayload.hitCount - 1]);
  39. float3 dynamicLight = unpackLight(rayPayload.dynamicLight[rayPayload.hitCount - 1]);
  40. float3 light = max(minLight, max(dynamicLight, dayLight));
  41. color = rayPayload.color[rayPayload.hitCount - 1].rgb * light;
  42. for (int i = rayPayload.hitCount - 2; i >= 0; i--)
  43. {
  44. dayLight = unpackLight(rayPayload.dayLight[i]);
  45. dynamicLight = unpackLight(rayPayload.dynamicLight[i]);
  46. light = max(minLight, max(dynamicLight, dayLight));
  47. color = rayPayload.color[i].rgb * light * rayPayload.color[i].a + color * (1 - rayPayload.color[i].a);
  48. }
  49. }
  50. uint outWidth, outHeight;
  51. gOutput.GetDimensions(outWidth, outHeight);
  52. uint2 outputIndex = uint2(dispatchPercentage * float2(outWidth, outHeight));
  53. if (renderGui)
  54. {
  55. uint guiWidth, guiHeight;
  56. guiTexture.GetDimensions(guiWidth, guiHeight);
  57. uint2 guiIndex = uint2(dispatchPercentage * float2(guiWidth, guiHeight));
  58. float4 guiColor = guiTexture[guiIndex];
  59. color = color * (1 - guiColor.a) + guiColor.rgb * guiColor.a;
  60. }
  61. gOutput[outputIndex] = float4(color, 1.f);
  62. }