DirectX Raytracing (DXR) Performance Sample Code
This sample demonstrates how to optimize DirectX Raytracing (DXR) performance in your Windows applications. It explores various techniques and best practices for achieving efficient ray tracing rendering pipelines, including shader optimization, resource management, and hardware acceleration features.
Key Features & Optimization Strategies
- Advanced ray generation shader techniques.
- Efficient miss and closest hit shader implementations.
- Ray payload optimization and data structure design.
- Utilizing hardware ray tracing features for maximum performance.
- Memory management and resource binding strategies for DXR.
- Profiling and debugging tools for DXR applications.
- Integration with modern rendering techniques.
Sample Code Snippets
Ray Generation Shader Example
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // This sample demonstrates a basic ray generation shader for DXR. // It traces rays for each pixel and samples a texture based on the hit result. #include "DXRHelper.hlsl" // Assuming DXR helper functions are defined here RaytracingAccelerationStructure Scene : register(t0); Texture2D &g_Texture : register(t1); SamplerState g_Sampler : register(s1); cbuffer CameraBuffer : register(b0) { matrix ViewProjectionInverse; float3 CameraPosition; }; struct RayPayload { float3 Color; uint HitKind; }; [shader("raygeneration")] void RGMain() { uint2 dispatchThreadID = DispatchRaysIndex(); uint2 dimensions = DispatchRaysDimensions(); float2 uv = float2(dispatchThreadID) / float2(dimensions); uv.y = 1.0f - uv.y; // Flip Y for correct texture mapping float3 rayOrigin; float3 rayDirection; // Calculate ray origin and direction from inverse view-projection matrix float4 clipPlane = float4(uv * 2.0f - 1.0f, 0.0f, 1.0f); float4 viewRay = mul(ViewProjectionInverse, clipPlane); viewRay.xyz /= viewRay.w; rayOrigin = CameraPosition; rayDirection = normalize(viewRay.xyz - CameraPosition); RayPayload payload; payload.Color = float3(0.0f, 0.0f, 0.0f); payload.HitKind = HIT_KIND_EMPTY; // Trace the ray TraceRay(Scene, RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, // Example flags 0xFF, // RayMask 0, // HitGroupIndex 0, // IntersectionOffset 0, // AnyHitOffset 0, // ClosestHitOffset rayOrigin, 0.001f, // TMin rayDirection, 1000.0f, // TMax 0); // Payload // Output the final color OutputPixel(dispatchThreadID.x, dispatchThreadID.y, payload.Color); }
Closest Hit Shader Example
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #include "DXRHelper.hlsl" Texture2D &g_Texture : register(t1); SamplerState g_Sampler : register(s1); struct RayPayload { float3 Color; uint HitKind; }; struct IntersectionAttributes { float2 UV; float3 Normal; }; [shader("closesthit")] void CHMain(inout RayPayload payload : SV_ATTRIBS, in IntersectionAttributes attribs : SV_IntersectionAttributes) { // Sample texture based on UV coordinates from intersection attributes payload.Color = g_Texture.Sample(g_Sampler, attribs.UV).rgb; payload.HitKind = HIT_KIND_GEOMETRY; // Indicate that a geometry was hit }
Download Sample Files
Access the complete sample code, including supporting files and project setup instructions, via the link below. This sample is designed for development on Windows with the latest DirectX SDK.
Download DXR Performance Sample (ZIP)