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

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)