RayGen.hlsl 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "Common.hlsl"
  2. // Raytracing output texture, accessed as a UAV
  3. RWTexture2D<float4> gOutput : register(u0);
  4. RWTexture2D<float4> guiTexture : register(u1);
  5. // Raytracing acceleration structure, accessed as a SRV
  6. RaytracingAccelerationStructure TLAS : register(t0);
  7. cbuffer RayGenerationSettings : register(b0)
  8. {
  9. int renderGui;
  10. int useRays;
  11. float minDistance;
  12. float maxDistance;
  13. float4x4 inverseView;
  14. float4x4 inverseProjection;
  15. }
  16. [shader("raygeneration")]
  17. void RayGen()
  18. {
  19. // Initialize the ray payload
  20. HitInfo rayPayload;
  21. rayPayload.colorAndDistance = float4(0, 0, !useRays ? 1 : 0, 1.0);
  22. // Get the location within the dispatched 2D grid of work items
  23. // (often maps to pixels, so this could represent a pixel coordinate).
  24. float2 dispatchDimensions = float2(DispatchRaysDimensions().xy);
  25. uint2 dispatchIndex = DispatchRaysIndex().xy;
  26. float2 dispatchPercentage = (dispatchIndex + 0.5f) / dispatchDimensions;
  27. if (useRays)
  28. {
  29. float2 d = (((dispatchIndex.xy + 0.5f) / dispatchDimensions.xy) * 2.f - 1.f);
  30. RayDesc ray;
  31. ray.Origin = mul(inverseView, float4(0, 0, 0, 1)).xyz;
  32. float4 target = mul(inverseProjection, float4(d.x, -d.y, 1, 1));
  33. ray.Direction = mul(inverseView, float4(target.xyz, 0)).xyz;
  34. ray.TMin = minDistance;
  35. ray.TMax = maxDistance;
  36. TraceRay(TLAS, /*RayFlags*/0, /*InstanceInclusionMask*/0xFF, /*RayContributionToHitGroupIndex*/0,
  37. /*MultiplierForGeometryContributionToHitGroupIndex*/0, /*MissShaderIndex*/0, ray, rayPayload);
  38. }
  39. uint outWidth, outHeight;
  40. gOutput.GetDimensions(outWidth, outHeight);
  41. uint2 outputIndex = uint2(dispatchPercentage * float2(outWidth, outHeight));
  42. if (renderGui)
  43. {
  44. uint guiWidth, guiHeight;
  45. guiTexture.GetDimensions(guiWidth, guiHeight);
  46. uint2 guiIndex = uint2(dispatchPercentage * float2(guiWidth, guiHeight));
  47. float4 guiColor = guiTexture[guiIndex];
  48. rayPayload.colorAndDistance.rgb = rayPayload.colorAndDistance.rgb * (1 - guiColor.a) + guiColor.rgb * guiColor.a;
  49. }
  50. gOutput[outputIndex] = float4(rayPayload.colorAndDistance.rgb, 1.f);
  51. }