/ appendices / VK_NV_ray_tracing.txt
VK_NV_ray_tracing.txt
1 include::meta/VK_NV_ray_tracing.txt[] 2 3 *Last Modified Date*:: 4 2018-11-20 5 6 *Interactions and External Dependencies*:: 7 - This extension requires the 8 https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/NV/SPV_NV_ray_tracing.html[`SPV_NV_ray_tracing`] 9 SPIR-V extension. 10 - This extension requires the 11 https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_ray_tracing.txt[`GL_NV_ray_tracing`] 12 extension for GLSL source languages. 13 14 *Contributors*:: 15 - Eric Werness, NVIDIA 16 - Ashwin Lele, NVIDIA 17 - Robert Stepinski, NVIDIA 18 - Nuno Subtil, NVIDIA 19 - Christoph Kubisch, NVIDIA 20 - Martin Stich, NVIDIA 21 - Daniel Koch, NVIDIA 22 - Jeff Bolz, NVIDIA 23 - Joshua Barczak, Intel 24 - Tobias Hector, AMD 25 - Henrik Rydgard, NVIDIA 26 - Pascal Gautron, NVIDIA 27 28 Rasterization has been the dominant method to produce interactive graphics, 29 but increasing performance of graphics hardware has made ray tracing a 30 viable option for interactive rendering. 31 Being able to integrate ray tracing with traditional rasterization makes it 32 easier for applications to incrementally add ray traced effects to existing 33 applications or to do hybrid approaches with rasterization for primary 34 visibility and ray tracing for secondary queries. 35 36 To enable ray tracing, this extension adds a few different categories of new 37 functionality: 38 39 * Acceleration structure objects and build commands 40 * A new pipeline type with new shader domains 41 * An indirection table to link shader groups with acceleration structure 42 items 43 44 This extension adds support for the following SPIR-V extension in Vulkan: 45 46 * `SPV_NV_ray_tracing` 47 48 === New Object Types 49 50 * slink:VkAccelerationStructureNV 51 52 === New Enum Constants 53 54 * Extending elink:VkStructureType: 55 ** ename:VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV 56 ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV 57 ** ename:VK_STRUCTURE_TYPE_GEOMETRY_NV 58 ** ename:VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV 59 ** ename:VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV 60 ** ename:VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV 61 ** ename:VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV 62 ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV 63 ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV 64 ** ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV 65 ** ename:VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV 66 * Extending elink:VkShaderStageFlagBits: 67 ** ename:VK_SHADER_STAGE_RAYGEN_BIT_NV 68 ** ename:VK_SHADER_STAGE_ANY_HIT_BIT_NV 69 ** ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV 70 ** ename:VK_SHADER_STAGE_MISS_BIT_NV 71 ** ename:VK_SHADER_STAGE_INTERSECTION_BIT_NV 72 ** ename:VK_SHADER_STAGE_CALLABLE_BIT_NV 73 * Extending elink:VkPipelineStageFlagBits: 74 ** ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV 75 ** ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV 76 * Extending elink:VkBufferUsageFlagBits: 77 ** ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV 78 * Extending elink:VkPipelineBindPoint: 79 ** ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_NV 80 * Extending elink:VkDescriptorType: 81 ** ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV 82 * Extending elink:VkAccessFlagBits: 83 ** ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV 84 ** ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV 85 * Extending elink:VkQueryType: 86 ** ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV 87 * Extending elink:VkPipelineCreateFlagBits: 88 ** ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV 89 * Extending elink:VkIndexType: 90 ** ename:VK_INDEX_TYPE_NONE_NV 91 92 === New Enums 93 94 ** elink:VkGeometryFlagBitsNV 95 ** elink:VkGeometryInstanceFlagBitsNV 96 ** elink:VkBuildAccelerationStructureFlagBitsNV 97 ** elink:VkCopyAccelerationStructureModeNV 98 ** elink:VkGeometryTypeNV 99 ** elink:VkRayTracingShaderGroupTypeNV 100 ** elink:VkAccelerationStructureMemoryRequirementsTypeNV 101 ** elink:VkAccelerationStructureTypeNV 102 103 === New Structures 104 105 ** slink:VkRayTracingPipelineCreateInfoNV 106 ** slink:VkGeometryTrianglesNV 107 ** slink:VkGeometryAABBNV 108 ** slink:VkGeometryDataNV 109 ** slink:VkGeometryNV 110 ** slink:VkAccelerationStructureCreateInfoNV 111 ** slink:VkBindAccelerationStructureMemoryInfoNV 112 ** slink:VkWriteDescriptorSetAccelerationStructureNV 113 ** slink:VkAccelerationStructureMemoryRequirementsInfoNV 114 ** slink:VkPhysicalDeviceRayTracingPropertiesNV 115 ** slink:VkRayTracingShaderGroupCreateInfoNV 116 ** slink:VkAccelerationStructureInfoNV 117 118 === New Functions 119 120 * flink:vkCreateAccelerationStructureNV 121 * flink:vkDestroyAccelerationStructureNV 122 * flink:vkGetAccelerationStructureMemoryRequirementsNV 123 * flink:vkBindAccelerationStructureMemoryNV 124 * flink:vkCmdBuildAccelerationStructureNV 125 * flink:vkCmdCopyAccelerationStructureNV 126 * flink:vkCmdTraceRaysNV 127 * flink:vkCreateRayTracingPipelinesNV 128 * flink:vkGetRayTracingShaderGroupHandlesNV 129 * flink:vkGetAccelerationStructureHandleNV 130 * flink:vkCmdWriteAccelerationStructuresPropertiesNV 131 * flink:vkCompileDeferredNV 132 133 === New or Modified Built-In Variables 134 135 * <<interfaces-builtin-variables-launchid,code:LaunchIDNV>> 136 * <<interfaces-builtin-variables-launchsize,code:LaunchSizeNV>> 137 * <<interfaces-builtin-variables-worldrayorigin,code:WorldRayOriginNV>> 138 * <<interfaces-builtin-variables-worldraydirection,code:WorldRayDirectionNV>> 139 * <<interfaces-builtin-variables-objectrayorigin,code:ObjectRayOriginNV>> 140 * <<interfaces-builtin-variables-objectraydirection,code:ObjectRayDirectionNV>> 141 * <<interfaces-builtin-variables-raytmin,code:RayTminNV>> 142 * <<interfaces-builtin-variables-raytmax,code:RayTmaxNV>> 143 * <<interfaces-builtin-variables-instancecustomindex,code:InstanceCustomIndexNV>> 144 * <<interfaces-builtin-variables-instanceid,code:InstanceId>> 145 * <<interfaces-builtin-variables-objecttoworld,code:ObjectToWorldNV>> 146 * <<interfaces-builtin-variables-worldtoobject,code:WorldToObjectNV>> 147 * <<interfaces-builtin-variables-hitt,code:HitTNV>> 148 * <<interfaces-builtin-variables-hitkind,code:HitKindNV>> 149 * <<interfaces-builtin-variables-incomingrayflags,code:IncomingRayFlagsNV>> 150 * (modified)code:PrimitiveId 151 152 === New SPIR-V Capabilities 153 154 * <<spirvenv-capabilities-table-raytracing,RayTracingNV>> 155 156 === Issues 157 158 1) Are there issues? 159 160 *RESOLVED*: Yes. 161 162 === Sample Code 163 164 Example ray generation GLSL shader 165 166 [source,c] 167 --------------------------------------------------- 168 #version 450 core 169 #extension GL_NV_ray_tracing : require 170 layout(set = 0, binding = 0, rgba8) uniform image2D image; 171 layout(set = 0, binding = 1) uniform accelerationStructureNV as; 172 layout(location = 0) rayPayloadNV float payload; 173 174 void main() 175 { 176 vec4 col = vec4(0, 0, 0, 1); 177 178 vec3 origin = vec3(float(gl_LaunchIDNV.x)/float(gl_LaunchSizeNV.x), float(gl_LaunchIDNV.y)/float(gl_LaunchSizeNV.y), 1.0); 179 vec3 dir = vec3(0.0, 0.0, -1.0); 180 181 traceNV(as, 0, 0xff, 0, 1, 0, origin, 0.0, dir, 1000.0, 0); 182 183 col.y = payload; 184 185 imageStore(image, ivec2(gl_LaunchIDNV.xy), col); 186 } 187 --------------------------------------------------- 188 189 === Version History 190 191 * Revision 1, 2018-09-11 (Robert Stepinski, Nuno Subtil, Eric Werness) 192 - Internal revisions 193 * Revision 2, 2018-10-19 (Eric Werness) 194 - rename to VK_NV_ray_tracing, add support for callables. 195 - too many updates to list 196 * Revision 3, 2018-11-20 (Daniel Koch) 197 - update to use InstanceId instead of InstanceIndex as implemented.