bringing ray tracing to vulkan · 2019-11-20 · current ray tracing ecosystem api overview. ......

50
© The Khronos ® Group Inc. 2019 - Page 1 This work is licensed under a Creative Commons Attribution 4.0 International License Bringing Ray Tracing to Vulkan Nuno Subtil, NVIDIA October 2019

Upload: others

Post on 14-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 1This work is licensed under a Creative Commons Attribution 4.0 International License

Bringing Ray Tracing to Vulkan

Nuno Subtil, NVIDIAOctober 2019

Page 2: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 2This work is licensed under a Creative Commons Attribution 4.0 International License

Outline

Motivation for Ray Tracing vs. Rasterization

Current Ray Tracing Ecosystem

API Overview

Page 3: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 3This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Tracing vs. Rasterization

• Rasterization: evaluate one triangle at a

time

- Store and accumulate some of the

output data, but discard most of it

• Computationally cheap, but “local”

• Amenable to hardware implementation

Page 4: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 4This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Tracing vs. Rasterization

• Ray tracing: sampling the entire scene

one ray at a time

- Entire scene is evaluated

- Can visit same primitive many times

• Extremely flexible

• Can be computationally intensive

Page 5: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 5This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Traced

Shadows

Physically correct shadows

Sharp and Contact Hardening

Page 6: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 6This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Traced

Ambient

Occlusion

Improved ambient occlusion

detail with fewer artifacts

RTAO

SSAO

Page 7: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 7This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Traced

Reflections

Physically-correct reflections on

arbitrary surfaces

Page 8: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 8This work is licensed under a Creative Commons Attribution 4.0 International License

Full Real-Time

Path Tracing

Physically-correct light

transport in a complex game

Page 9: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 9This work is licensed under a Creative Commons Attribution 4.0 International License

Current Ray Tracing Ecosystem• Existing APIs

- VK_NV_ray_tracing (NVIDIA only)

- Microsoft DXR (cross-vendor)

• Ray tracing capable platforms

- Turing GPU architecture (NVIDIA)

- Recent market announcements suggest more incoming

• Ray-tracing capable applications showing up

- Battlefield V (DICE)

- Wolfenstein: Youngblood (MachineGames)

- Control (Remedy)

- JX3 Online (Kingsoft)

- Quake II (id Software/Bethesda/NVIDIA)

- …

Page 10: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 10This work is licensed under a Creative Commons Attribution 4.0 International License

Wolfenstein: Youngblood

Page 11: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 11This work is licensed under a Creative Commons Attribution 4.0 International License

Wolfenstein: Youngblood(Work in Progress)

Page 12: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 12This work is licensed under a Creative Commons Attribution 4.0 International License

JX3 Online

Page 13: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 13This work is licensed under a Creative Commons Attribution 4.0 International License

JX3 Online

Page 14: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 14This work is licensed under a Creative Commons Attribution 4.0 International License

Quake II RTX

Page 15: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 15This work is licensed under a Creative Commons Attribution 4.0 International License

Quake II RTX

Page 16: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 17This work is licensed under a Creative Commons Attribution 4.0 International License

Quake II RTX

Page 17: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 18This work is licensed under a Creative Commons Attribution 4.0 International License

Bringing Ray Tracing to Vulkan

(A preview based on VK_NV_ray_tracing)

Page 18: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 19This work is licensed under a Creative Commons Attribution 4.0 International License

Bringing Ray Tracing to Vulkan

• Cross-vendor KHR extension under development

- We can’t share too much detail just yet

• Largely based on and functionally similar to VK_NV_ray_tracing

- … but keep in mind KHR hasn’t shipped yet!

• We’ll be presenting concepts from VK_NV_ray_tracing, not a cross-vendor

version

- We expect final KHR version to be a superset

- The functionality we’re presenting should be very similar between NV and KHR

- … but keep in mind KHR hasn’t shipped yet!

Page 19: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 20This work is licensed under a Creative Commons Attribution 4.0 International License

Graphics Pipelines

Rasterization

Ray

Generation

Traversal &

IntersectionShadingScheduling Scheduling

Vertex

Shading

Fragment

ShadingROP

Draw

CallRasterizationScheduling

Ray Tracing

Page 20: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 21This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Tracing Building Blocks

Acceleration Structure

Abstraction for scene geometry, enables efficient scene traversal

Ray tracing shader domains

Handle ray generation and termination, intersections, material shading

Shader binding table

Links shaders and resources to be used during traversal

Ray tracing pipeline state object

Collection of ray tracing shader binaries

Page 21: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 22This work is licensed under a Creative Commons Attribution 4.0 International License

Acceleration Structures

Ray tracing: testing one ray against all scene primitives

Acceleration structures required for efficient operation

Page 22: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 23This work is licensed under a Creative Commons Attribution 4.0 International License

Acceleration Structures

• Dual-level acceleration structure

• Opaque (implementation-defined) data

structures

• Efficient build and update

Top Level Acceleration Structure (AS)

Transform

and shading

information

Bottom

Level AS

Bottom

Level AS

Transform

and shading

information

Transform

and shading

information

Page 23: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 24This work is licensed under a Creative Commons Attribution 4.0 International License

Building Acceleration Structures

Bottom Level ASVertex & Index

BuffersBuild/Update

Bottom Level ASVertex & Index

BuffersBuild/Update

Bottom Level ASVertex & Index

BuffersBuild/Update

Page 24: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 25This work is licensed under a Creative Commons Attribution 4.0 International License

Building Acceleration Structures

Bottom Level AS Xform / Shading

Top Level ASBottom Level AS Xform / Shading Build/Update

Bottom Level AS Xform / Shading

Page 25: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 26This work is licensed under a Creative Commons Attribution 4.0 International License

Creating Acceleration Structures

• New object type

VkAccelerationStructureNV

• New descriptor type for binding AS

to shaders

struct VkAccelerationStructureInfoNV {VkStructureType sType;void *pNext;// top-level or bottom-levelVkAccelerationStructureTypeNV type;VkAccelerationStructureCreateFlagsNV flags;uint32_t instanceCount;uint32_t geometryCount;const VkGeometryNV* pGeometries;

};

vkCreateAccelerationStructureNV(VkDevice device,constVkAccelerationStructureCreateInfoNV *info,const VkAllocationCallbacks *pAllocator,VkAccelerationStructureNV *pAccelerationStruct

);

Page 26: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 27This work is licensed under a Creative Commons Attribution 4.0 International License

Acceleration Structure Memory Management

• Backing store for AS is managed by

application

• Memory requirements will vary

vkGetAccelerationStructureMemoryRequirementsNV(VkDevice device,const VkAccelerationStructureMemoryRequirementsInfoNV

*pInfo,VkMemoryReqiurements2 *pMemoryRequirements

);

vkBindAccelerationStructureMemoryNV(…);

Page 27: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 28This work is licensed under a Creative Commons Attribution 4.0 International License

Acceleration Structure Build/Update

• Single command to build or update

an AS

• AS updates have restrictions for

efficiency

vkCmdBuildAccelerationStructureNV(VkCommandBuffer cmdBuf,const VKAccelerationStructutreInfoNV*,VkBuffer instanceData,VkDeviceSize instanceOffset,VkBool32 update,VkAccelerationStructureNV dst,VkAccelerationStructureNV src,VkBuffer scratch,VkDeviceSize scratchOffset

);

Page 28: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 29This work is licensed under a Creative Commons Attribution 4.0 International License

Acceleration Structure Copy

• Acceleration structures can be

copied, optionally compacting

during the copy

vkCmdCopyAccelerationStructureNV(VkCommandBuffer cmdBuf,VkAccelerationStructureNV dst,VkAccelerationStructureNV src,VkCopyAccelerationStructureModeNV mode

);

Page 29: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 30This work is licensed under a Creative Commons Attribution 4.0 International License

Ray tracing shader domains

Ray Generation

IntersectionAny-Hit

IntersectionAny-Hit

Closest-Hit

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Intersection

Any Hit

yesno

Page 30: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 31This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation:Allocate and fill initial payload

Any-hit: read/update payload

Closest Hit:read/update

Payload

Inter-shader Communication• Ray Payload

- Application-defined structure to pass

data between hit stages and shader

stage that spawned a ray

- Used to return final intersection

information to ray generation shader

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Intersection

Any Hit

yesno

Page 31: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 32This work is licensed under a Creative Commons Attribution 4.0 International License

Inter-shader Communication• Ray Attributes

- Application-defined structure to pass

intersection information from

intersection shader to hit shadersRay Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Intersection

Any Hit

yesnoIntersection: write attributes

Any Hit: read attributes

Intersection: write attributesClosest Hit: read attributes

Page 32: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 33This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Intersection

Any Hit

yesno

Ray Generation Shaders

• Starting point for all ray tracing work

• Simple grid of threads launched from

host

• Traces rays, writes final output

Page 33: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 34This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Any Hit

yesno

Intersection

Intersection Shaders

• Compute ray intersections with app-

defined primitives

• Ray-triangle intersections built-in

Page 34: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 35This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss Closest Hit

Intersection

yesno

Any Hit

Any-Hit Shader

• Invoked after an intersection is found

• Multiple intersections invoked in

arbitrary order

Page 35: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 36This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Miss

Intersection

Any Hit

yesno

Closest Hit

Closest-Hit Shaders

• Invoked on the closest intersection of

the ray

• Can read attributes and trace rays to

modify the payload

Page 36: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 37This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Generation

traceNV()

Acceleration

Structure

Traversal

Hit?

Closest Hit

Intersection

Any Hit

yesno

Miss

Miss Shader

• Invoked if no hit is found and accepted

• Can trace rays and modify ray payload

Page 37: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 38This work is licensed under a Creative Commons Attribution 4.0 International License

Mapping to GLSL: Inter-shader Interface

• Ray payload and intersection

attributes: new block decorations

• traceNV() builtin may be called

with different payload structures in

a single shader

rayPayloadNV { … }intersectionAttributesNV { … }

layout (location= 1)rayPayloadNV firstInterface {…}

layout (location= 2)rayPayloadNV secondInterface {…}

traceNV(…, 1) // firstInterfacetraceNV(…, 2) // secondInterface

Page 38: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 39This work is licensed under a Creative Commons Attribution 4.0 International License

Mapping to GLSL: Tracing Rays

• Built-in variable decorations:

- ID/index information

- ray parameters, hit parameters

- instance transforms

• New functions:

- traceNV() traces a ray into the

scene

- reportIntersectionNV()

outputs intersection information

- ignoreIntersectionNV() rejects

an intersection

- terminateRayNV() terminates

the current ray

traceNV(accelerationStructure topLevel,uint rayFlags,uint cullMask,uint sbtRecordOffset,uint sbtRecordStride,uint missIndex,vec3 origin,float tmin,vec3 direction,float tmax,int payload

);

reportIntersectionNV(float hit,uint hitKind

);

ignoreIntersectionNV();

terminateRayNV();

Page 39: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 40This work is licensed under a Creative Commons Attribution 4.0 International License

Shader Binding Table

• A given ray query into the scene can hit any object

- … with different kinds of material shaders

- … requiring different kinds of resources (e.g., textures)

- … and different parameters (e.g., transparency value)

- … per object instance!

Page 40: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 41This work is licensed under a Creative Commons Attribution 4.0 International License

Shader Binding Table

• Array of opaque shader handles + application storage inside VkBuffer

• Indexing used to determine shaders / data used

• App-defined stride for SBT records to accommodate different resource sets

Page 41: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 42This work is licensed under a Creative Commons Attribution 4.0 International License

Shader Binding Table

......

RT Pipeline with RayGeneration

ShaderBindingTable Buffer

Acceleration Structures

Shader Reference

Custom Data & Indices

Descriptor Sets

Shader Reference

Custom Data & Indices

Traversal yields

instanceOffset

Descriptor Sets

Textures etc.

RT Pipeline with ClosestHit

Shader

traces rays

Shader reacts on

hit (can trace)

Page 42: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 43This work is licensed under a Creative Commons Attribution 4.0 International License

Shader Binding Table and vkCmdTraceRaysNVvkCmdTraceRaysNV(VkCommandBuffer, VkBuffer shaderBindingTable, raygenIndex, …)

......

RT Pipeline with RayGeneration

ShaderBindingTable Buffer

Acceleration Structures

Shader Reference

Custom Data & Indices

Descriptor Sets

Shader Reference

Custom Data & Indices

3: Traversal yields

instanceOffset

Descriptor Sets

Textures etc.

RT Pipeline with ClosestHit

2: Shader

traces rays

4: Shader reacts

on hit (can trace)

1: API invokes RayGeneration Shader

Page 43: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 44This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Tracing Pipeline Creation

• Ray tracing pipeline contains all

shaders used together

• Can have multiple shaders of the

same stage

• Facilities provided to enable multi-

threaded shader compilation within

a ray tracing PSO

struct VkRaytracingPipelineCreateInfoNV {VkStructureType sType;void *pNext;

VkPipelineCreateFlags flags;uint32_t stageCount;constVkPipelineShaderStageCreateInfo *stages;uint32_t groupCount;constVkRayTracingShaderGroupCreateInfoNV*pGroups;

uint32_t maxRecursionDepth;VkPipelineLayout layout;VkPipeline basePipelineHandle;int32_t basePipelineIndex;

};

vkCreateRaytracingPipelinesNV(…);

Page 44: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 45This work is licensed under a Creative Commons Attribution 4.0 International License

Ray Tracing Shader Handles

• Exposes opaque shader handles to

be used inside Shader Binding Table

vkGetRaytracingShaderGroupHandlesNV(VkDevice device,VkPipeline pipeline,uint32_t firstGroup,uint32_t groupCount,size_t dataSize,void *pData

);

Page 45: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 46This work is licensed under a Creative Commons Attribution 4.0 International License

vkCmdTraceRaysNV

• Entry point to invoke ray tracing

work

• Uses existing vkCmdBindPipeline

and vkCmdBindDescriptrSets with

new bind point

vkCmdTraceRaysNV(VkCommandBuffer cmdBuf,VkBuffer raygenSBT,VkDeviceSize raygenSBTOffset,VkBuffer missSBT,VkDeviceSize missSBTOffset,VkDeviceSize missSBTStride,VkBuffer hitSBT,VkDeviceSize hitSBTOffset,VkDeviceSize hitSBTStride,VkBuffer callableSBT,VkDeviceSize callableSBTOffset,VkDeviceSize callableSBTStride,uint32_t width,uint32_t height,uint32_t depth

);

Page 46: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 47This work is licensed under a Creative Commons Attribution 4.0 International License

Example Ray Generation Shader// Binding for the acceleration structure

layout(set = 0, binding = 0) accelerationStructureNV scene;

layout(set = 1, binding = 0) image2D framebufferImage;

layout(set = 2, binding = 0, std140) uniform traceParameters {

uint sbtMiss;

uint sbtOffset;

uint sbtStride;

vec3 origin;

vec3 dir;

}

layout(location = 1) rayPayloadNV primaryPayload {

vec4 color;

}

void main() {

primaryPayload.color = vec4(0.0, 0.0, 0.0, 0.0);

traceNV(scene, 0, 0, sbtMiss, sbtOffset, sbtStride, traceParameters.origin,

0.0, computeDir(gl_GlobalInvocationIDNV.xy, traceParameters.dir),

1.e9, 1);

imageStore(framebufferImage, gl_GlobalInvocationIDNV.xy, primaryPayload.color);

}

Page 47: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 48This work is licensed under a Creative Commons Attribution 4.0 International License

Example Closest Hit Shader

// Closest hit shader

//

// Closest hit shaders only have one payload -

// for the incoming ray

rayPayloadInNV primaryPayload {

vec4 color;

}

layout(set = 3, binding = 0) sampler3D solidMaterialSampler;

void main() {

vec3 pos = gl_WorldRayOriginNV + gl_hitTNV * gl_WorldRayDirectionNV;

primaryPayload.color = texture(

solidMaterialSampler, pos);

}

Page 48: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 49This work is licensed under a Creative Commons Attribution 4.0 International License

Iterative Loop Path Tracing in RayGen Shadervec3 color = 0.0f;

Float sample_pdf = 1.0f;

vec3 path_throughput = 1.0f;

// GBufferEntry contains all necessary info to reconstruct the hit and local brdf

GBufferEntry gbuffer_entry = imageLoad(gbuffer, gl_GlobalInvocationID.xy);

Ray ray = reconstruct_ray( gbuffer_entry, pixel ); // reconstruct the first ray

for (uint32 bounce = 0; bounce < max_bounces; ++bounce) {

// unpack the brdf

Brdf brdf = get_brdf( gbuffer_entry );

// accumulate emission of the local surface

color += path_throughput * local_emission( gbuffer_entry, brdf, sample_pdf );

// perform next-event estimation (casts one or more shadow rays, getting visibility as a return value)

color += path_throughput * next_event_estimation( gbuffer_entry, brdf, sample_pdf );

// sample the brdf

vec3 sample_throughput;

ray = sample_brdf( gbuffer_entry, brdf, sample_throughput, sample_pdf );

// perform Russian-Roulette to terminate path

if (random() >= max(sample_throughput))

break;

// accumulate the path throughput

path_throughput *= sample_throughput / max(sample_throughput);

// trace a ray and get a brdf as a return value

gbuffer_entry = trace(…, ray.origin, ray.direction, …);

}

Page 49: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 50This work is licensed under a Creative Commons Attribution 4.0 International License

HLSL SupportMainline DXC can compile DXR shaders into SPIR-V

- Currently targeting NV vendor extension, but likely easy to convert to KHR

- NVIDIA intends to contribute support for KHR version once it is final

Resource binding model is different between DXR and Vulkan

- DXR: SBT contains local root signature, used by the bytecode compiler to map

resources

- VK_NV_ray_tracing: SBT is just memory, used by the shader directly- Intent is for app to use EXT_descriptor_indexing to make resources available, then

store indices in the SBT record

- EXT_device_buffer_address allows buffer pointers in SBT

Shader Binding Table exposed as a constant-buffer-like binding

- General problem of mapping SBT to a DXR local root signature can be solved, but

no implementation work has been done

- Developer feedback suggests this is enough in practice

Page 50: Bringing Ray Tracing to Vulkan · 2019-11-20 · Current Ray Tracing Ecosystem API Overview. ... Largely based on and functionally similar to VK_NV_ray_tracing - … but keep in mind

© The Khronos® Group Inc. 2019 - Page 51This work is licensed under a Creative Commons Attribution 4.0 International License

Conclusion

• Ray tracing is coming to Vulkan!

- Driven by industry interest

- Enables growing ecosystem of ray tracing capable apps to target Vulkan

- Current design largely compatible with shipping NV extension