D3D12LookDevPTWinUI Rendering Pipeline Learning Guide

July 27, 2026 · View on GitHub

Japanese documentation: レンダリングパイプライン学習ガイド

This guide is intended for students of real-time rendering and path tracing who want to connect each stage of D3D12LookDevPTWinUI's implementation to the process that turns one frame into an image. It covers not only the algorithms in general, but also distinguishes what is implemented in the current repository, what is provided by optional backends or fallbacks, and what remains unimplemented.

A good reading order is to start with the full-frame overview, inspect the stages that interest you through Debug Views, and then read the linked shaders.

Note

This document describes the current implementation, not a target architecture. Primary Visibility is produced inside the Path Tracing RayGen rather than in an independent pass. RTXDI currently extends through ReSTIR DI, while DLSS Ray Reconstruction currently extends only through its runtime probe.

1. Two Output Goals

D3D12LookDevPTWinUI separates two rendering paths with different goals.

PathGoalMain approach
InteractiveAim for stable, game-like quality while navigating at 1080pReuse a small number of rays over time and allow some bias to suppress noise and flicker
Reference StillProduce a high-SPP reference image for comparing materials and lightingDisable ReSTIR, contribution compression, the denoiser, and Final TAA, then accumulate Baseline MIS for a long time

Interactive output stabilizes faster than the Reference path because it uses previous frames, neighboring pixels, and prior knowledge encoded in the denoiser. Reference Still instead prioritizes a simple estimator that converges through many samples rather than temporal stabilization.

2. Full View of One Frame

The ordinary Interactive Beauty path follows the host-side D3D12PathTracingBackend::PopulateCommandList in this order:

flowchart LR
    FS["FrameState / camera / jitter / history validity"] --> PT["DXR DispatchRays<br/>path tracing + first-hit guides"]
    PT --> G["Surface guides<br/>normal, view-Z, motion, identity"]
    PT --> S["Lighting signals<br/>diffuse, specular, residual"]
    G --> R{"RTXDI ReSTIR DI<br/>active?"}
    S --> R
    R -->|"yes"| RA["Pass A<br/>candidate + temporal"]
    RA --> RB["Pass B<br/>spatial + visibility + shade"]
    R -->|"no"| D
    RB --> D{"Denoiser"}
    D -->|"NRD"| N["NrdPrepareCS<br/>REBLUR / RELAX"]
    D -->|"Internal"| I["Temporal + moments<br/>hit-distance-aware A-Trous"]
    D -->|"Off"| O["Current HDR"]
    N --> T["FinalTaaCS<br/>HDR resolve + sharpen"]
    I --> T
    O --> T
    T --> TM["Exposure + None / Reinhard / ACES fitted<br/>gamma encoding"]
    TM --> P["Swap-chain copy + PRESENT transition"]
    P --> C["DXGI composition + WinUI"]

The actual command-list order is:

  1. DispatchRays
  2. RunRestirReusePass
  3. RunDenoisePass
  4. RunFinalTaaPass
  5. RunQualityCounterPass during normal execution and combined/quality benchmarks; skipped only for performance benchmarks
  6. SealSurfaceGuideFrame
  7. CopyOutputToBackBuffer
  8. Transition the composition swap-chain buffer to PRESENT and present it

Tone mapping is conceptually the final stage, but it normally runs at the end of FinalTaaCS. Paths that do not use Final TAA perform the same display transform in RayGen or the denoiser composite.

Reference Still uses a separate, shorter path:

flowchart LR
    A["Baseline MIS path tracing"] --> B["Unclamped float32 progressive accumulation"]
    B --> C["Exposure + tone mapping"]
    C --> D["Present"]
    X["RTXDI / contribution compression / denoiser / Final TAA"] -. disabled .-> B

3. From Scene Data to DXR Traversal

3.1 Scene Import and GPU Resources

Static meshes imported by Assimp are converted into vertex/index buffers, geometry records, a material buffer, and a texture table. Materials contain base color, normal, roughness, metallic, occlusion, emissive, and alpha-mask inputs.

DXR uses the following acceleration structures:

  • BLAS: a structure for traversing the triangles in mesh geometry
  • TLAS: a structure that combines instances and BLASes for traversal of the full scene

Non-alpha geometry is marked with D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE to avoid unnecessary AnyHit invocations. Editing an alpha mask also changes the geometry flag, so the BLAS is updated.

3.2 Shader Stages and Small Payloads

The primary shaders for the DXR pass are in PathTracingABI.hlsli.

ShaderRole
RayGenGenerate a camera ray per pixel, run the path loop, evaluate the material/BSDF, and output AOVs and signals
MissReport that the ray did not hit geometry
ClosestHitStore only hit distance, barycentrics, and instance/geometry/primitive IDs in the payload
AnyHitInspect the alpha-mask texel and call IgnoreHit when it is transparent
ShadowMiss / ShadowAnyHitLightweight shaders for visibility rays

The path payload is 32 bytes, and the shadow payload is 12 bytes. Evaluating material textures in ClosestHit would require carrying that state in a larger payload. Instead, this implementation returns only intersection information and evaluates the material once in RayGen, reducing register pressure and memory traffic during ray traversal.

4. Path Tracing One Pixel

The conceptual flow of one sample is:

flowchart TD
    C["Camera sample<br/>jittered primary ray"] --> X{"TraceRay result"}
    X -->|"miss"| SKY["Environment / procedural sky"]
    X -->|"hit"| MAT["Load surface + PBR material"]
    MAT --> E["Add emissive term"]
    MAT --> NEE["Next Event Estimation<br/>Sun / sky / local light"]
    NEE --> SH["Visibility shadow ray"]
    SH --> MIS["Light PDF vs BSDF PDF<br/>power-heuristic MIS"]
    MAT --> BS["Sample BSDF mixture<br/>diffuse cosine or GGX VNDF"]
    BS --> CONT["Update throughput<br/>propagate ray cone"]
    CONT --> RR{"Russian roulette<br/>after min bounce"}
    RR -->|"continue"| X
    RR -->|"stop"| OUT["Accumulate radiance"]
    SKY --> OUT
    E --> OUT
    MIS --> OUT
    OUT --> L["Diffuse / Specular / Residual signals"]

4.1 Metallic-Roughness PBR BSDF

Surface shading combines:

  • Diffuse: a cosine-weighted Lambert term
  • Specular: GGX normal distribution, Smith masking-shadowing, and Schlick Fresnel
  • Metallic workflow: interpolate between dielectric F0=0.04 and the base color using metallic
  • Minimum roughness of 0.04: avoids numerical instability from highlights that approach an extreme delta distribution

A continuation ray selects one lobe from the diffuse/specular mixture. The specular direction uses Heitz-style isotropic GGX VNDF sampling to efficiently sample visible microfacet normals even at grazing angles. Throughput is updated by dividing the full BSDF, not only the selected lobe, by the same mixture PDF.

4.2 Next Event Estimation and MIS

With BSDF rays alone, the probability of randomly hitting a small light is low. Next Event Estimation (NEE) therefore samples a direction toward a light directly at every path vertex and tests visibility with a shadow ray.

The current Baseline path evaluates:

  • Sun: a delta light for which no shadow ray is emitted when N dot L <= 0
  • Environment / procedural sky: importance sampled through a luminance times sin(theta) alias table when an HDRI is present
  • Emissive mesh triangles and procedural analytic area lights: selected from a power-weighted light alias table
  • BSDF samples that reach the sky or an emitter: the corresponding light PDF is evaluated

When light sampling and BSDF sampling can generate the same path, they are weighted with the power heuristic:

w_light = p_light^2 / (p_light^2 + p_bsdf^2)

This smoothly combines the strengths of each technique: light sampling for small lights and BSDF sampling for sharp reflections.

4.3 Russian Roulette and Final-Bounce Elision

After the configured minimum bounce, a path terminates with a probability derived from its throughput. A surviving path divides its throughput by the continuation probability, preserving the expected value in the Reference path.

After adding NEE and emission on the final bounce, another ray cannot be traced. The shader therefore skips BSDF direction generation, PDF calculation, throughput update, and roulette. This is an example of reducing shader work without changing image quality.

5. Sampling and Texture Stability

5.1 Owen-Scrambled Sobol

Random sequences use Owen-scrambled Sobol from PathTracingSampling.hlsli. Dimensions are fixed by pixel, frame/sample, bounce, and purpose.

Dimension purposeExample
CameraSub-pixel primary ray
SkyEnvironment direction and alias selection
LightLight ID and light surface
BSDFLobe selection and direction
Russian roulettePath continuation decision

Fixed purposes help prevent a feature being enabled or disabled from shifting later random dimensions and changing the noise pattern across the entire image. Adaptive sampling reserves an interval of 32 sample indices per frame so a changing sample count never rewinds the sequence.

The default Stable32 camera jitter repeats a 32-phase Halton sequence with bases 2 and 3, and sample 0 matches the host temporal jitter. The UI can also select a longer-period Halton sequence or Off. At multiple SPP, each additional sample generates a distinct primary ray.

5.2 Ray Cones and Mip LOD

Ray tracing does not automatically receive the screen-space derivatives available to a rasterizer. Always reading mip 0 makes distant textures, normal maps, HDRIs, and alpha foliage change violently from frame to frame.

This implementation initializes a ray-cone spread from the camera pixel and propagates the cone width according to hit distance and scattering roughness. It derives a UV footprint from the triangle's world-space area, UV-space area, and incidence angle, then uses that footprint to select a SampleLevel mip LOD.

5.3 Alpha Coverage and Specular AA

  • Alpha-masked base-color textures receive a corrected alpha scale during mip generation to preserve coverage
  • AnyHit also uses the ray-cone-derived mip to reduce boiling in distant foliage
  • Toksvig-like specular AA estimates normal variance from the mean vector length in a normal mip and adds it to roughness
  • Material feature bits skip textures that do not exist, and packed ORM is sampled only once

These techniques control the frequency observed by the ray correctly instead of blurring the result in a later stage.

6. Surface Guides and Lighting Signals

Stabilizing a low-SPP result over time requires more than RGB; the renderer also needs information that determines whether two samples belong to the same surface. Guides are generated from the primary hit of the first path sample.

The current GPU texture pack has these meanings:

ResourceContents
g_denoiseAov0RGB containing a 0..1 encoding of the world-space shading normal, plus positive linear view-Z
g_denoiseAov1Base color RGB plus linear roughness
g_denoiseAov2previousUV - currentUV, previousViewZ - currentViewZ, and primary hit T
g_surfaceIdentityA packed instance / geometry / material hash, primitive signature, and 4-bit coverage value
g_signalDirectRGB primary diffuse-lobe estimator plus the first diffuse-secondary hit distance
g_signalIndirectRGB primary specular-lobe estimator plus the first specular-secondary hit distance
g_signalResidualUnfiltered residual RGB such as emission/sky, plus metallic
Confidence texturesPer-lobe diffuse/specular sample and history confidence

The resource names Direct and Indirect are legacy names. Their current meanings are the Diffuse and Specular lobes. The public C++ semantic contract is defined by SurfaceGuides and LightingSignals in RenderStabilityTypes.h. However, those public structures describe a semantic contract that includes room for future extensions; the current GPU pack does not keep geometric and shading normals as separate AOVs, nor does it store full individual IDs and the ray footprint separately.

Primary and secondary hit distances are not interchangeable. To judge the spatial extent of a reflection or diffuse lobe, the denoiser needs to know how far that lobe's first continuation ray traveled. When adaptive half skips a secondary sample, hit distance 0 is used as an "unsampled" sentinel.

7. Motion, Reprojection, and History

7.1 2.5D Motion

Surface motion is stored in non-jitter coordinates as:

motion.xy = previousUV - currentUV
motion.z  = previousViewZ - currentViewZ

The current/previous jitter delta is added only when history is read. Because jitter is not baked into the motion itself, NRD, ReSTIR, and TAA can share the same contract. For sky/miss pixels, Final TAA uses background motion reconstructed from camera rotation.

7.2 Validated Bilinear Reprojection

Simply reading the nearest previous RGB pixel mixes foreground and background at silhouettes. This implementation validates all four bilinear taps at the reprojected location independently.

flowchart LR
    C["Current surface"] --> M["2.5D motion + jitter delta"]
    M --> U["Previous sub-pixel position"]
    U --> B["4 bilinear taps"]
    B --> V{"depth / normal / roughness<br/>albedo / identity valid?"}
    V -->|"valid taps"| W["Renormalized weighted history"]
    V -->|"all invalid"| N["Small depth-aware dilation"]
    N -->|"compatible neighbor"| W
    N -->|"none"| R["Reject as disocclusion"]
    W --> H["Next current/history blend"]
    R --> H

The small dilation runs only when all four taps are invalid. Avoiding extra neighbors when bilinear reconstruction is already valid reduces silhouette blur.

7.3 Immutable A/B Ping-Pong

Surface Guides have two A/B sets, with the current and previous set selected by frame parity. The same history UAV is never read and written within one dispatch, and the previous set remains immutable throughout the frame. There is no end-of-frame full-resolution copy of the four textures; only a UAV ordering point is inserted before the next frame writes them.

TAA history, internal-denoiser history, and RTXDI reservoirs follow the same principle.

7.4 History Domains

Resetting everything after every change brings noise back during camera motion, while never resetting anything causes old lighting or geometry to ghost. The host records changes in FrameChangeMask and invalidates only the required HistoryDomain values.

ChangeSurfaceLighting / RTXDIDenoiser / TAAReference accumulation
Ordinary camera motionPreserve and reprojectPreservePreserveReset
Camera cut / projection / resizeResetResetResetReset
Material / light / HDRIPreserveResetResetReset
Geometry / topologyResetResetResetReset
Denoiser settingPreservePreserveResetPreserve in principle
Backend / quality profilePreserveResetResetReset
View setting such as a debug viewPreservePreserveResetReset

8. RTXDI ReSTIR DI

Instead of fully evaluating many light candidates at every pixel, ReSTIR DI selects a representative sample from a small candidate set and reuses that sample across time and space.

A reservoir is not an RGB average. It stores sample identity and statistics such as:

  • Light index and sample UV on the light
  • Weight / inverse PDF and target PDF
  • Number of candidates seen, M
  • Spatial distance, visibility fields, and age

The current implementation uses two dispatches:

flowchart LR
    L["Local candidates<br/>emissive mesh + analytic area"] --> A["Pass A registers"]
    PH["Immutable previous reservoir A"] --> A
    A -->|"candidate + validated temporal combine"| SB["Scratch reservoir B"]
    SB --> P["Pass B<br/>4 stable or 8 young/disoccluded neighbors"]
    G["Current Surface Guides"] --> P
    P --> E["Re-evaluate target and PDF<br/>at current surface"]
    E --> V["One final visibility ray"]
    V --> O["Diffuse/Specular direct signal<br/>+ next history A"]

Pass A keeps the local candidate in registers while combining it with the previous reservoir, then writes once to scratch B. Pass B reads only scratch, combining four neighbors for stable history or up to eight for young/disoccluded history. The selected sample is finally re-evaluated at the current surface for its target, PDF, emissive texture, BSDF, and visibility.

The current RTXDI candidate set includes emissive mesh triangles and procedural analytic area lights. The Baseline path tracer handles Sun, Environment, and lighting at secondary vertices. RTXDI ReSTIR GI/PT is not implemented, so selecting the ReSTIR GI name still uses the Baseline fallback for indirect lighting. See RTXDI ReSTIR DI for details.

9. Denoising

9.1 Why Split Lobes?

Diffuse lighting usually varies smoothly over broad neighborhoods, while a small position or normal error can change the reflected direction dramatically for low-roughness Specular. Applying one filter strength either leaves Diffuse noisy or blurs Specular. The renderer therefore maintains separate history, moments, confidence, and hit distance for each lobe.

9.2 NVIDIA NRD

NrdPrepareCS converts Surface Guides and lobe estimators into NRD's official resource contract.

  1. Pack world normal and roughness with the official encoding
  2. Output positive linear view-Z and 2.5D motion
  3. Demodulate Diffuse/Specular by their material factors
  4. Pack real secondary hit distance and confidence in REBLUR/RELAX format
  5. After the NRD dispatches, restore the material factors and add the residual

interactive_game selects REBLUR, while sharp_preview selects RELAX. In the ordinary NRD Beauty path, FinalTaaCS directly remodulates and composites NRD output, avoiding a separate NrdCompositeCS. Validation views, quality benchmarks, and TAA-off operation retain the explicit Composite path. NrdPrepareCS itself is still an independent pass.

9.3 Internal Fallback

When NRD is not compiled, SDK evaluation is unavailable, or the internal backend is selected, the renderer uses its own denoiser:

  • Validated bilinear temporal reprojection
  • Separate Diffuse/Specular history, first and second luminance moments, and history length
  • RGB neighborhood clamping, luminance moments, and confidence-driven anti-lag
  • Confidence based on normal, view-Z, albedo, roughness, and motion
  • Edge-aware A-Trous filtering using lobe hit distance
  • Short history and strong rejection for low-roughness Specular

See NRD backend for details about NRD and the fallback.

10. Final HDR TAA, Sharpening, and Tone Mapping

The denoiser mainly stabilizes surface lighting, but temporal variation remains at silhouettes, in the sky, in alpha coverage, and in the final composite. A 1:1 Final TAA pass therefore runs in HDR after denoising and before tone mapping.

FinalTaaCS performs these steps:

  1. Load an 8x8 group of current HDR plus a one-pixel halo into a 10x10 groupshared tile
  2. Reproject history using surface motion or background motion
  3. Fetch bilinear history validated against guides
  4. Clip only young/reactive history to the YCoCg range of the current 3x3 neighborhood
  5. Select the current-frame weight from motion, history length, stop-and-go settling, and NRD maturity
  6. Apply contrast-adaptive sharpening only to mature, stationary history
  7. Save HDR history, then apply exposure, the tone mapper, and gamma

A long history window suppresses stationary noise, but locking too early would also preserve the denoiser's initial blur. The current implementation keeps an update aperture of up to roughly 32 frames during REBLUR's maturity period, then transitions to a longer stability window. Sharpening is capped by the configured strength, whose default is 0.15, and weakens in flat regions, across extreme edges, and during motion.

The available tone mappers are None, Reinhard, and an ACES fitted curve. The ACES option here is not a complete ACES color-management pipeline. None of these options changes the path estimator; they are display transforms that map HDR values into a displayable range.

11. Adaptive Sampling and the Ray Budget

Interactive dynamically adjusts the following to balance frame time and quality:

  • During camera motion: 1 spp by default, up to 2 bounces
  • After motion stops: restore bounce count and the additional-sample quota gradually over settleFrames
  • High variance, insufficient history, or disocclusion: promote up to the adaptive SPP limit
  • Sustained GPU budget pressure: reduce the additional-sample quota, then bounce count, and finally the secondary shading rate
  • A sufficiently long period below budget: restore quality one step at a time

Adaptive-SPP classification currently runs per pixel inside RayGen. With the internal denoiser it uses previous moments; with an external backend it uses the luminance residual between sample 0 and validated TAA history. The independent secondary pass with an 8x8 compact tile work list and ExecuteIndirect has not been implemented.

adaptive_half keeps primary visibility and primary-vertex direct lighting at full resolution, but skips half of the BSDF continuations in a checkerboard pattern. The following pixels are promoted back to full rate:

  • Invalid history, disocclusion, or young history
  • Alpha mask / coverage edges
  • Roughness < 0.15
  • Metallic surfaces or high specular probability
  • Unstable variance, reactive state, or confidence

12. Contribution Compression

At 1 spp, a rare high-energy path appears as an isolated firefly. Interactive applies a shared scale to path contributions that exceed the luminance limit.

The important detail is that the same scale is applied to the Diffuse/Specular signals instead of clamping only Beauty. Otherwise, the energy seen by the denoiser would disagree with the final estimator. Quality benchmarks record energy before and after compression.

Reference Still sets the limit to zero, disabling contribution compression and temporal clamping.

13. Render Modes and Quality Profiles

Render Modes

UI / project nameCurrent effective implementation
Baseline PTBaseline MIS direct + indirect
ReSTIR DIRTXDI local-light DI + Baseline indirect / Sun / Environment
ReSTIR GIBaseline direct + indirect; ReSTIR GI/PT is not implemented
ReSTIR GI + DIRTXDI local-light DI + Baseline indirect; GI/PT falls back

The renderer falls back to Baseline PT when RTXDI was not built, the runtime ABI check fails, restirBackend: off is selected, or Reference Still is active.

Quality Profiles

ProfileDenoiserTemporal processingSecondaryPurpose
interactive_gameREBLUR or internal fallbackReSTIR DI when selected + Final TAAMay use autoStability and speed during interaction
sharp_previewRELAX or internal fallbackReSTIR DI when selected + Final TAAFullSharper, still-oriented preview
reference_stillOffRTXDI / Final TAA OffFullHigh-SPP reference image

14. GPU/CPU Performance Techniques

In addition to image-quality algorithms, the implementation contains techniques that produce the same result with less work:

  • Overlap CPU and GPU work with three FrameContexts, avoiding a forced wait after every Present
  • Use per-frame or fixed A/B descriptor tables so they are never rewritten while in use by the GPU
  • Mark non-alpha geometry opaque to skip AnyHit
  • Use a 32-byte path payload and 12-byte shadow payload
  • Use material feature bits, packed ORM, and cached texture existence
  • Calculate camera ray-cone spread once on the host
  • Fuse ReSTIR DI into two passes and remove the reservoir publish copy
  • Remove the full-resolution Surface Guide history copy
  • Fuse Composite and Final TAA on the ordinary NRD Beauty path
  • Keep WinUI composition outside the renderer GPU command list; Render Only Mode collapses the editor chrome
  • Do not run full-screen quality counters in performance benchmarks

Their effects are visible in Diagnostics / Stats and the per-pass benchmark timestamps.

15. Learning with Debug Views

Looking only at Beauty does not reveal whether a problem originates in sampling, guides, the denoiser, or TAA. Inspecting the following in order makes the source easier to understand:

  1. Check material inputs with Base Color, World Normal, Normal Texture, Roughness, and Metallic
  2. Check reprojection inputs with Motion Vector, NRD Linear View-Z, and NRD 2.5D Motion
  3. Inspect Diffuse Signal, Specular Signal, and Emission / Sky independently
  4. Compare NRD Input Validation, Temporal Input, Temporal Output Detail, and A-Trous Output
  5. Inspect History Length, History Confidence, and TAA History Acceptance
  6. Compare Final and Reference Still from the same camera

Suggested small experiments:

  • Pan across a roughness sweep and observe specular highlights and changes in ray-cone mip selection
  • Dolly toward alpha foliage and observe mip coverage and AnyHit stability
  • Compare a small emissive source between Baseline and ReSTIR DI
  • Verify that history acceptance reaches zero on a camera cut
  • Observe ghosting and settling during a slow pan, fast turn, and stop-and-go motion
  • Verify that Surface Guides continue to update every frame when the denoiser is Off
  • Accumulate reference_still to high SPP and compare Interactive bias and blur

Benchmarks with a fixed seed and camera path are well suited to reproducible comparisons. See Benchmark paths and analysis for the procedure.

16. Implementation File Guide

TopicPrimary file
Frame graph, resources, and dispatch orderD3D12PathTracingBackend.cpp
FrameState, history domains, and signal semanticsRenderStabilityTypes.h
Path loop, BSDF, MIS, ray cones, and AOV outputPathTracingABI.hlsli
Sobol / Owen samplingPathTracingSampling.hlsli
RTXDI two-pass ReSTIR DIReSTIRResolve.hlsl
Internal temporal / A-TrousPathTracingDenoise.hlsl
NRD input packing / compositePathTracingNrd.hlsl
HDR TAA / sharpening / tone mappingPathTracingTaa.hlsl
NRD SDK bridgeNrdBackend.cpp
RTXDI SDK/build boundaryRtxdiBackend.cpp
Texture mips and alpha coverageTextureLoader.cpp

17. Current Limitations

The following items are future extensions and must not be treated as implemented:

  • An independent Primary Visibility pass and compact secondary work list
  • Separate AOVs for geometric and shading normals, and complete instance/material/primitive IDs
  • RTXDI ReSTIR PT / GI
  • A unified RTXDI candidate table that includes Sun / Environment
  • Secondary one-light mixture MIS
  • BLAS compaction
  • Real ray counters for hardware traversal / AnyHit
  • Previous transforms for moving instances, skinning, and continuous deformation
  • DLSS Ray Reconstruction frame resource tagging and evaluation
  • Dynamic resolution, TAAU, and reduced-resolution NRD
  • A raster fallback for GPUs without DXR support
  • Applying the movingJitterScale value retained in the UI/JSON to the actual jitter amplitude

An optional backend being able to start does not mean it meets the 1080p60, blur, and ghosting quality gates in every scene. Each scene must be validated with a fixed camera path, a high-SPP reference, and per-pass timings.

18. Glossary

TermMeaning
SPPSamples Per Pixel: the number of path samples traced for one pixel in one frame
BounceThe number of times a path reflects or scatters at a surface
NEEA method that samples a light directly and emits a shadow ray
MISA method that combines multiple sampling techniques according to their PDFs
PDFThe probability density with which a sample is selected
AOV / GuideAuxiliary information other than Beauty, such as normal, depth, and motion
DemodulationTemporarily removing material factors to make a lighting signal easier to filter
ReprojectionUsing motion to locate the previous position corresponding to the current pixel
DisocclusionA surface becoming newly visible after previously being hidden, for example by camera motion
ReservoirThe structure in which ReSTIR stores a representative sample and weight statistics
Ray coneAn approximation of the footprint represented by a ray