#include "Common.hlsl" // Raytracing output texture, accessed as a UAV RWTexture2D gOutput : register(u0); RWTexture2D guiTexture : register(u1); // Raytracing acceleration structure, accessed as a SRV RaytracingAccelerationStructure TLAS : register(t0); cbuffer RayGenerationSettings : register(b0) { int renderGui; int useRays; float minDistance; float maxDistance; float4x4 inverseView; float4x4 inverseProjection; } [shader("raygeneration")] void RayGen() { // Initialize the ray payload HitInfo rayPayload; rayPayload.colorAndDistance = float4(0, 0, !useRays ? 1 : 0, 1.0); // Get the location within the dispatched 2D grid of work items // (often maps to pixels, so this could represent a pixel coordinate). float2 dispatchDimensions = float2(DispatchRaysDimensions().xy); uint2 dispatchIndex = DispatchRaysIndex().xy; float2 dispatchPercentage = (dispatchIndex + 0.5f) / dispatchDimensions; if (useRays) { float2 d = (((dispatchIndex.xy + 0.5f) / dispatchDimensions.xy) * 2.f - 1.f); RayDesc ray; ray.Origin = mul(inverseView, float4(0, 0, 0, 1)).xyz; float4 target = mul(inverseProjection, float4(d.x, -d.y, 1, 1)); ray.Direction = mul(inverseView, float4(target.xyz, 0)).xyz; ray.TMin = minDistance; ray.TMax = maxDistance; TraceRay(TLAS, /*RayFlags*/0, /*InstanceInclusionMask*/0xFF, /*RayContributionToHitGroupIndex*/0, /*MultiplierForGeometryContributionToHitGroupIndex*/0, /*MissShaderIndex*/0, ray, rayPayload); } uint outWidth, outHeight; gOutput.GetDimensions(outWidth, outHeight); uint2 outputIndex = uint2(dispatchPercentage * float2(outWidth, outHeight)); if (renderGui) { uint guiWidth, guiHeight; guiTexture.GetDimensions(guiWidth, guiHeight); uint2 guiIndex = uint2(dispatchPercentage * float2(guiWidth, guiHeight)); float4 guiColor = guiTexture[guiIndex]; rayPayload.colorAndDistance.rgb = rayPayload.colorAndDistance.rgb * (1 - guiColor.a) + guiColor.rgb * guiColor.a; } gOutput[outputIndex] = float4(rayPayload.colorAndDistance.rgb, 1.f); }