18 #if defined( _MSC_VER )
19 # pragma warning( disable : 4201 )
21 #elif defined( __clang__ )
22 # pragma clang diagnostic ignored "-Wmissing-braces"
23 # if ( 10 <= __clang_major__ )
24 # pragma clang diagnostic ignored "-Wdeprecated-volatile"
26 #elif defined( __GNUC__ )
34 #include <GLFW/glfw3.h>
41 #define GLM_FORCE_DEPTH_ZERO_TO_ONE
42 #define GLM_FORCE_RADIANS
43 #define GLM_ENABLE_EXPERIMENTAL
44 #include "../utils/shaders.hpp"
45 #include "../utils/utils.hpp"
47 #include "SPIRV/GlslangToSpv.h"
49 #include <glm/glm.hpp>
50 #include <glm/gtc/matrix_inverse.hpp>
51 #include <glm/gtc/matrix_transform.hpp>
53 static char const * AppName =
"RayTracing";
54 static char const * EngineName =
"Vulkan.hpp";
59 glm::mat4x4
const & transform_, uint32_t instanceID_, uint8_t mask_, uint32_t instanceOffset_, uint8_t flags_, uint64_t accelerationStructureHandle_ )
62 assert( !( instanceID_ & 0xFF000000 ) && !( instanceOffset_ & 0xFF000000 ) );
63 memcpy(
transform, &transform_, 12 *
sizeof(
float ) );
74 static_assert(
sizeof(
GeometryInstanceData ) == 64,
"GeometryInstanceData structure compiles to incorrect size" );
104 std::vector<std::pair<vk::AccelerationStructureNV, glm::mat4x4>>
const & instances,
105 std::vector<vk::GeometryNV>
const & geometries )
107 assert( instances.empty() ^ geometries.empty() );
112 instances.empty() ? vk::AccelerationStructureTypeNV::eBottomLevel : vk::AccelerationStructureTypeNV::eTopLevel;
113 vk::AccelerationStructureInfoNV accelerationStructureInfo( accelerationStructureType, {}, vk::su::checked_cast<uint32_t>( instances.size() ), geometries );
120 assert( 0 < resultSizeInBytes );
121 accelerationStructureData.
resultBufferData = std::unique_ptr<vk::su::BufferData>(
130 assert( 0 < scratchSizeInBytes );
132 accelerationStructureData.
scratchBufferData = std::unique_ptr<vk::su::BufferData>(
135 if ( !instances.empty() )
140 std::vector<GeometryInstanceData> geometryInstanceData;
141 for (
size_t i = 0; i < instances.size(); i++ )
151 static_cast<uint32_t
>( i ),
153 static_cast<uint32_t
>( 2 * i ),
154 static_cast<uint8_t
>( vk::GeometryInstanceFlagBitsNV::eTriangleCullDisable ),
155 accelerationStructureHandle ) );
181 return accelerationStructureData;
214 glm::vec3
diffuse = glm::vec3( 0.7f, 0.7f, 0.7f );
232 static const std::vector<Vertex> cubeData = {
235 {
Vertex( glm::vec3( -1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
236 {
Vertex( glm::vec3( 1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
237 {
Vertex( glm::vec3( 1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
238 {
Vertex( glm::vec3( 1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
239 {
Vertex( glm::vec3( -1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
240 {
Vertex( glm::vec3( -1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, 0.0f, 1.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
242 {
Vertex( glm::vec3( 1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
243 {
Vertex( glm::vec3( -1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
244 {
Vertex( glm::vec3( -1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
245 {
Vertex( glm::vec3( -1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
246 {
Vertex( glm::vec3( 1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
247 {
Vertex( glm::vec3( 1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, 0.0f, -1.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
249 {
Vertex( glm::vec3( -1.0f, -1.0f, -1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
250 {
Vertex( glm::vec3( -1.0f, -1.0f, 1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
251 {
Vertex( glm::vec3( -1.0f, 1.0f, 1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
252 {
Vertex( glm::vec3( -1.0f, 1.0f, 1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
253 {
Vertex( glm::vec3( -1.0f, 1.0f, -1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
254 {
Vertex( glm::vec3( -1.0f, -1.0f, -1.0f ), glm::vec3( -1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
256 {
Vertex( glm::vec3( 1.0f, -1.0f, 1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
257 {
Vertex( glm::vec3( 1.0f, -1.0f, -1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
258 {
Vertex( glm::vec3( 1.0f, 1.0f, -1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
259 {
Vertex( glm::vec3( 1.0f, 1.0f, -1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
260 {
Vertex( glm::vec3( 1.0f, 1.0f, 1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
261 {
Vertex( glm::vec3( 1.0f, -1.0f, 1.0f ), glm::vec3( 1.0f, 0.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
263 {
Vertex( glm::vec3( -1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
264 {
Vertex( glm::vec3( 1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
265 {
Vertex( glm::vec3( 1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
266 {
Vertex( glm::vec3( 1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
267 {
Vertex( glm::vec3( -1.0f, 1.0f, -1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
268 {
Vertex( glm::vec3( -1.0f, 1.0f, 1.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
270 {
Vertex( glm::vec3( -1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
271 {
Vertex( glm::vec3( 1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 1.0f, 0.0f ), 0 ) },
272 {
Vertex( glm::vec3( 1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
273 {
Vertex( glm::vec3( 1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 1.0f, 1.0f ), 0 ) },
274 {
Vertex( glm::vec3( -1.0f, -1.0f, 1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 0.0f, 1.0f ), 0 ) },
275 {
Vertex( glm::vec3( -1.0f, -1.0f, -1.0f ), glm::vec3( 0.0f, -1.0f, 0.0f ), glm::vec2( 0.0f, 0.0f ), 0 ) },
281 #extension GL_ARB_separate_shader_objects : enable
283 layout(binding = 0) uniform UniformBufferObject
291 layout(location = 0) in vec3 inPosition;
292 layout(location = 1) in vec3 inNormal;
293 layout(location = 2) in vec2 inTexCoord;
294 layout(location = 3) in int inMatID;
296 layout(location = 0) flat out int outMatID;
297 layout(location = 1) out vec2 outTexCoord;
298 layout(location = 2) out vec3 outNormal;
307 gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
309 outTexCoord = inTexCoord;
310 outNormal = vec3(ubo.modelIT * vec4(inNormal, 0.0));
317 #extension GL_ARB_separate_shader_objects : enable
318 #extension GL_EXT_nonuniform_qualifier : enable
320 layout(location = 0) flat in int matIndex;
321 layout(location = 1) in vec2 texCoord;
322 layout(location = 2) in vec3 normal;
329 const int sizeofMat = 1;
331 layout(binding = 1) buffer MaterialBufferObject { vec4[] m; } materials;
332 layout(binding = 2) uniform sampler2D[] textureSamplers;
334 Material unpackMaterial()
337 vec4 d0 = materials.m[sizeofMat * matIndex + 0];
340 m.textureID = floatBitsToInt(d0.w);
345 layout(location = 0) out vec4 outColor;
349 vec3 lightVector = normalize(vec3(5, 4, 3));
351 float dot_product = max(dot(lightVector, normalize(normal)), 0.2);
353 Material m = unpackMaterial();
355 if (0 <= m.textureID)
357 c *= texture(textureSamplers[m.textureID], texCoord).xyz;
361 outColor = vec4(c, 1);
365 static std::string raygenShaderText = R
"(
368 #extension GL_NV_ray_tracing : require
370 layout(binding = 0, set = 0) uniform accelerationStructureNV topLevelAS;
371 layout(binding = 1, set = 0, rgba8) uniform image2D image;
373 layout(binding=2, set = 0) uniform UniformBufferObject
383 layout(location = 0) rayPayloadNV vec3 hitValue;
387 const vec2 pixelCenter = vec2(gl_LaunchIDNV.xy) + vec2(0.5);
388 const vec2 inUV = pixelCenter/vec2(gl_LaunchSizeNV.xy);
389 vec2 d = inUV * 2.0 - 1.0;
391 vec4 origin = cam.viewInverse*vec4(0,0,0,1);
392 vec4 target = cam.projInverse * vec4(d.x, d.y, 1, 1) ;
393 vec4 direction = cam.viewInverse*vec4(normalize(target.xyz), 0) ;
395 uint rayFlags = gl_RayFlagsOpaqueNV;
396 uint cullMask = 0xff;
398 float tmax = 10000.0;
400 traceNV(topLevelAS, rayFlags, cullMask, 0 /*sbtRecordOffset*/, 0 /*sbtRecordStride*/, 0 /*missIndex*/, origin.xyz, tmin, direction.xyz, tmax, 0 /*payload*/);
401 imageStore(image, ivec2(gl_LaunchIDNV.xy), vec4(hitValue, 0.0));
405 static std::string missShaderText = R
"(
408 #extension GL_NV_ray_tracing : require
410 layout(location = 0) rayPayloadInNV vec3 hitValue;
414 hitValue = vec3(0.0, 0.1, 0.3);
418 static std::string shadowMissShaderText = R
"(
421 #extension GL_NV_ray_tracing : require
423 layout(location = 2) rayPayloadInNV bool isShadowed;
430 static std::string closestHitShaderText = R
"(
433 #extension GL_NV_ray_tracing : require
434 #extension GL_EXT_nonuniform_qualifier : enable
436 layout(location = 0) rayPayloadInNV vec3 hitValue;
437 layout(location = 2) rayPayloadNV bool isShadowed;
439 hitAttributeNV vec3 attribs;
440 layout(binding = 0, set = 0) uniform accelerationStructureNV topLevelAS;
442 layout(binding = 3, set = 0) buffer Vertices { vec4 v[]; } vertices;
443 layout(binding = 4, set = 0) buffer Indices { uint i[]; } indices;
445 layout(binding = 5, set = 0) buffer MatColorBufferObject { vec4[] m; } materials;
446 layout(binding = 6, set = 0) uniform sampler2D[] textureSamplers;
455 // Number of vec4 values used to represent a vertex
458 Vertex unpackVertex(uint index)
462 vec4 d0 = vertices.v[vertexSize * index + 0];
463 vec4 d1 = vertices.v[vertexSize * index + 1];
464 vec4 d2 = vertices.v[vertexSize * index + 2];
467 v.nrm = vec3(d0.w, d1.xy);
469 v.matIndex = floatBitsToInt(d2.x);
478 // Number of vec4 values used to represent a material
479 const int sizeofMat = 1;
481 Material unpackMaterial(int matIndex)
484 vec4 d0 = materials.m[sizeofMat * matIndex + 0];
487 m.textureID = floatBitsToInt(d0.w);
493 ivec3 ind = ivec3(indices.i[3 * gl_PrimitiveID], indices.i[3 * gl_PrimitiveID + 1], indices.i[3 * gl_PrimitiveID + 2]);
495 Vertex v0 = unpackVertex(ind.x);
496 Vertex v1 = unpackVertex(ind.y);
497 Vertex v2 = unpackVertex(ind.z);
499 const vec3 barycentrics = vec3(1.0 - attribs.x - attribs.y, attribs.x, attribs.y);
501 vec3 normal = normalize(v0.nrm * barycentrics.x + v1.nrm * barycentrics.y + v2.nrm * barycentrics.z);
503 vec3 lightVector = normalize(vec3(5, 4, 3));
505 float dot_product = max(dot(lightVector, normal), 0.2);
507 Material mat = unpackMaterial(v1.matIndex);
509 vec3 c = dot_product * mat.diffuse;
510 if (0 <= mat.textureID)
512 vec2 texCoord = v0.texCoord * barycentrics.x + v1.texCoord * barycentrics.y + v2.texCoord * barycentrics.z;
513 c *= texture(textureSamplers[mat.textureID], texCoord).xyz;
517 vec3 origin = gl_WorldRayOriginNV + gl_WorldRayDirectionNV * gl_HitTNV;
519 traceNV(topLevelAS, gl_RayFlagsTerminateOnFirstHitNV|gl_RayFlagsOpaqueNV|gl_RayFlagsSkipClosestHitShaderNV, 0xFF, 1 /* sbtRecordOffset */, 0 /* sbtRecordStride */, 1 /* missIndex */, origin,
520 tmin, lightVector, tmax, 2 /*payload location*/);
529 #ifndef IMGUI_VK_QUEUED_FRAMES
530 # define IMGUI_VK_QUEUED_FRAMES 2
539 static void check_vk_result(
VkResult err )
551 static void cursorPosCallback( GLFWwindow * window,
double mouseX,
double mouseY )
561 if ( glfwGetKey( window, GLFW_KEY_LEFT_ALT ) == GLFW_PRESS )
565 if ( glfwGetKey( window, GLFW_KEY_LEFT_CONTROL ) == GLFW_PRESS )
569 if ( glfwGetKey( window, GLFW_KEY_LEFT_SHIFT ) == GLFW_PRESS )
575 cameraManipulator.
mouseMove( glm::ivec2(
static_cast<int>( mouseX ),
static_cast<int>( mouseY ) ), mouseButton, modifiers );
579 static void errorCallback(
int error,
const char * description )
581 fprintf( stderr,
"GLFW Error %d: %s\n", error, description );
584 static void framebufferSizeCallback( GLFWwindow * window,
int w,
int h )
590 static void keyCallback( GLFWwindow * window,
int key,
int ,
int action,
int )
592 if ( action == GLFW_PRESS )
596 case GLFW_KEY_ESCAPE:
597 case 'Q': glfwSetWindowShouldClose( window, 1 );
break;
600 AppInfo * appInfo =
reinterpret_cast<AppInfo *
>( glfwGetWindowUserPointer( window ) );
608 static void mouseButtonCallback( GLFWwindow * window,
int ,
int ,
int )
611 glfwGetCursorPos( window, &xpos, &ypos );
614 cameraManipulator.
setMousePosition( glm::ivec2(
static_cast<int>( xpos ),
static_cast<int>( ypos ) ) );
617 static void scrollCallback( GLFWwindow * window,
double ,
double yoffset )
620 cameraManipulator.
wheel(
static_cast<int>( yoffset ) );
624 static std::random_device randomDevice;
625 static std::mt19937 randomGenerator( randomDevice() );
627 template <
typename T>
628 T
random( T minValue = std::numeric_limits<T>::min(), T maxValue = std::numeric_limits<T>::max() )
630 static_assert( std::numeric_limits<T>::is_integer,
"Type T needs to be an integral type!\n" );
631 std::uniform_int_distribution<> randomDistribution( minValue, maxValue );
633 return static_cast<T
>( randomDistribution( randomGenerator ) );
638 std::uniform_real_distribution<float> randomDistribution( minValue, maxValue );
640 return glm::vec3( randomDistribution( randomGenerator ), randomDistribution( randomGenerator ), randomDistribution( randomGenerator ) );
643 uint32_t
roundUp( uint32_t value, uint32_t alignment )
645 return ( ( value + alignment - 1 ) / alignment ) * alignment;
651 const size_t xMax = 10;
652 const size_t yMax = 10;
653 const size_t zMax = 10;
660 glfwSetErrorCallback( errorCallback );
663 std::cerr << AppName <<
": can't initialize glfw!\n";
666 if ( !glfwVulkanSupported() )
668 std::cerr << AppName <<
": Vulkan not supported!\n";
673 glfwWindowHint( GLFW_CLIENT_API, GLFW_NO_API );
675 GLFWwindow * window = glfwCreateWindow( windowExtent.
width, windowExtent.
height, AppName,
nullptr,
nullptr );
678 glfwSetCursorPosCallback( window, cursorPosCallback );
679 glfwSetFramebufferSizeCallback( window, framebufferSizeCallback );
680 glfwSetKeyCallback( window, keyCallback );
681 glfwSetMouseButtonCallback( window, mouseButtonCallback );
682 glfwSetScrollCallback( window, scrollCallback );
686 glm::vec3 diagonal = 3.0f * glm::vec3(
static_cast<float>( xMax ),
static_cast<float>( yMax ),
static_cast<float>( zMax ) );
688 glfwSetWindowUserPointer( window, &appInfo );
691 uint32_t glfwExtensionsCount;
692 const char ** glfwExtensions = glfwGetRequiredInstanceExtensions( &glfwExtensionsCount );
693 std::vector<std::string> instanceExtensions;
694 instanceExtensions.reserve( glfwExtensionsCount + 1 );
695 for ( uint32_t i = 0; i < glfwExtensionsCount; i++ )
697 instanceExtensions.push_back( glfwExtensions[i] );
702 #if !defined( NDEBUG )
708 for (
auto pd : physicalDevices )
710 std::vector<vk::ExtensionProperties> ep = pd.enumerateDeviceExtensionProperties();
711 if ( std::any_of( ep.cbegin(),
713 [](
vk::ExtensionProperties const & prop ) { return strcmp( prop.extensionName, VK_NV_RAY_TRACING_EXTENSION_NAME ) == 0; } ) )
719 if ( !physicalDevice )
728 check_vk_result( err );
735 graphicsAndPresentQueueFamilyIndex.first,
736 { VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
737 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
738 VK_KHR_MAINTENANCE_3_EXTENSION_NAME,
739 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
740 VK_NV_RAY_TRACING_EXTENSION_NAME },
745 std::array<PerFrameData, IMGUI_VK_QUEUED_FRAMES> perFrameData;
748 perFrameData[i].commandPool = device.createCommandPool(
vk::CommandPoolCreateInfo( {}, graphicsAndPresentQueueFamilyIndex.first ) );
749 perFrameData[i].commandBuffer =
756 vk::Queue graphicsQueue = device.getQueue( graphicsAndPresentQueueFamilyIndex.first, 0 );
757 vk::Queue presentQueue = device.getQueue( graphicsAndPresentQueueFamilyIndex.second, 0 );
760 std::vector<vk::DescriptorPoolSize> poolSizes = {
774 graphicsAndPresentQueueFamilyIndex.first,
775 graphicsAndPresentQueueFamilyIndex.second );
783 std::vector<vk::Framebuffer> framebuffers =
789 const size_t textureCount = 10;
790 std::vector<vk::su::TextureData> textures;
791 textures.reserve( textureCount );
792 for (
size_t i = 0; i < textureCount; i++ )
794 textures.emplace_back( physicalDevice,
796 vk::Extent2D( random<uint32_t>( 2, 8 ) * 16, random<uint32_t>( 2, 8 ) * 16 ),
803 perFrameData[0].commandPool,
807 for (
auto & t : textures )
812 { random<uint8_t>(), random<uint8_t>(), random<uint8_t>() } ) );
817 const size_t materialCount = 10;
818 assert( materialCount == textureCount );
819 std::vector<Material> materials( materialCount );
820 for (
size_t i = 0; i < materialCount; i++ )
822 materials[i].diffuse =
randomVec3( 0.0f, 1.0f );
823 materials[i].textureID = vk::su::checked_cast<uint32_t>( i );
829 std::vector<Vertex> vertices;
830 vertices.reserve( xMax * yMax * zMax * cubeData.size() );
831 for (
size_t x = 0; x < xMax; x++ )
833 for (
size_t y = 0; y < yMax; y++ )
835 for (
size_t z = 0; z < zMax; z++ )
837 int m = random<int>( 0, materialCount - 1 );
839 for (
auto const & v : cubeData )
841 vertices.push_back( v );
842 vertices.back().pos += 3.0f * glm::vec3(
static_cast<float>( x ),
static_cast<float>( y ),
static_cast<float>( z ) ) + jitter;
843 vertices.back().matID =
static_cast<int>( m );
850 std::vector<unsigned int> indices( vertices.size() );
851 std::iota( indices.begin(), indices.end(), 0 );
860 vertexBufferData.
upload( physicalDevice, device, perFrameData[0].commandPool, graphicsQueue, vertices,
VertexStride );
864 indices.size() *
sizeof( uint32_t ),
867 indexBufferData.
upload( physicalDevice, device, perFrameData[0].commandPool, graphicsQueue, indices,
sizeof( uint32_t ) );
869 glm::mat4x4 transform( glm::mat4x4( 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ) );
878 glslang::InitializeProcess();
881 glslang::FinalizeProcess();
886 std::make_pair( vertexShaderModule,
nullptr ),
887 std::make_pair( fragmentShaderModule,
nullptr ),
901 vk::DescriptorSet descriptorSet = device.allocateDescriptorSets( descriptorSetAllocateInfo ).front();
914 perFrameData[0].commandPool,
920 vk::su::checked_cast<uint32_t>( vertices.size() ),
925 vk::su::checked_cast<uint32_t>( indices.size() ),
932 physicalDevice, device, commandBuffer, { std::make_pair( bottomLevelAS.accelerationStructure, transform ) }, std::vector<vk::GeometryNV>() );
938 perFrameData[0].commandPool,
947 bufferMemoryBarrier.buffer = indexBufferData.
buffer;
952 std::vector<vk::DescriptorSetLayoutBinding> bindings;
959 bindings.emplace_back( 6,
961 vk::su::checked_cast<uint32_t>( textures.size() ),
964 std::vector<vk::DescriptorPoolSize> descriptorPoolSizes;
965 descriptorPoolSizes.reserve( bindings.size() );
966 for (
const auto & b : bindings )
968 descriptorPoolSizes.emplace_back( b.descriptorType, vk::su::checked_cast<uint32_t>( swapChainData.
images.size() ) * b.descriptorCount );
972 vk::DescriptorPool rayTracingDescriptorPool = device.createDescriptorPool( descriptorPoolCreateInfo );
974 std::vector<vk::DescriptorSetLayout> layouts;
975 for (
size_t i = 0; i < swapChainData.
images.size(); i++ )
977 layouts.push_back( rayTracingDescriptorSetLayout );
980 std::vector<vk::DescriptorSet> rayTracingDescriptorSets = device.allocateDescriptorSets( descriptorSetAllocateInfo );
984 std::vector<vk::WriteDescriptorSet> accelerationDescriptionSets;
985 for (
size_t i = 0; i < rayTracingDescriptorSets.size(); i++ )
987 accelerationDescriptionSets.emplace_back(
988 rayTracingDescriptorSets[i], 0, 0, 1, bindings[0].descriptorType,
nullptr,
nullptr,
nullptr, &writeDescriptorSetAcceleration );
990 device.updateDescriptorSets( accelerationDescriptionSets,
nullptr );
994 for (
size_t i = 0; i < rayTracingDescriptorSets.size(); i++ )
997 rayTracingDescriptorSets[i],
998 { { bindings[2].descriptorType, uniformBufferData.buffer,
VK_WHOLE_SIZE, {} },
1007 glslang::InitializeProcess();
1012 glslang::FinalizeProcess();
1015 std::vector<vk::PipelineShaderStageCreateInfo> shaderStages;
1016 std::vector<vk::RayTracingShaderGroupCreateInfoNV> shaderGroups;
1039 shaderGroups.emplace_back(
1050 uint32_t maxRecursionDepth = 2;
1054 switch ( rvPipeline.
result )
1060 default: assert(
false );
1068 uint32_t raygenShaderBindingOffset = 0;
1069 uint32_t raygenShaderTableSize = shaderGroupHandleSize;
1070 uint32_t missShaderBindingOffset = raygenShaderBindingOffset +
roundUp( raygenShaderTableSize, shaderGroupBaseAlignment );
1071 uint32_t missShaderBindingStride = shaderGroupHandleSize;
1072 uint32_t missShaderTableSize = 2 * missShaderBindingStride;
1073 uint32_t hitShaderBindingOffset = missShaderBindingOffset +
roundUp( missShaderTableSize, shaderGroupBaseAlignment );
1074 uint32_t hitShaderBindingStride = shaderGroupHandleSize;
1075 uint32_t hitShaderTableSize = 2 * hitShaderBindingStride;
1077 uint32_t shaderBindingTableSize = hitShaderBindingOffset + hitShaderTableSize;
1078 std::vector<uint8_t> shaderHandleStorage( shaderBindingTableSize );
1079 (void)device.getRayTracingShaderGroupHandlesNV( rayTracingPipeline, 0, 1, raygenShaderTableSize, &shaderHandleStorage[raygenShaderBindingOffset] );
1080 (void)device.getRayTracingShaderGroupHandlesNV( rayTracingPipeline, 1, 2, missShaderTableSize, &shaderHandleStorage[missShaderBindingOffset] );
1081 (void)device.getRayTracingShaderGroupHandlesNV( rayTracingPipeline, 3, 2, hitShaderTableSize, &shaderHandleStorage[hitShaderBindingOffset] );
1085 shaderBindingTableBufferData.
upload( device, shaderHandleStorage );
1087 std::array<vk::ClearValue, 2> clearValues;
1092 uint32_t frameIndex = 0;
1094 uniformBufferObject.
model = glm::mat4( 1 );
1095 uniformBufferObject.
modelIT = glm::inverseTranspose( uniformBufferObject.
model );
1097 double accumulatedTime{ 0.0 };
1098 size_t frameCount{ 0 };
1099 while ( !glfwWindowShouldClose( window ) )
1101 double startTime = glfwGetTime();
1105 glfwGetWindowSize( window, &w, &h );
1106 if ( ( w !=
static_cast<int>( windowExtent.
width ) ) || ( h !=
static_cast<int>( windowExtent.
height ) ) )
1108 windowExtent.
width = w;
1117 graphicsAndPresentQueueFamilyIndex.first,
1118 graphicsAndPresentQueueFamilyIndex.second );
1123 perFrameData[frameIndex].commandPool,
1135 assert( 0 < windowExtent.
height );
1137 uniformBufferObject.
proj = glm::perspective( glm::radians( 65.0f ), windowExtent.
width /
static_cast<float>( windowExtent.
height ), 0.1f, 1000.0f );
1138 uniformBufferObject.
proj[1][1] *= -1;
1139 uniformBufferObject.
viewInverse = glm::inverse( uniformBufferObject.
view );
1140 uniformBufferObject.
projInverse = glm::inverse( uniformBufferObject.
proj );
1141 uniformBufferData.upload( device, uniformBufferObject );
1145 device.acquireNextImageKHR( swapChainData.
swapChain, UINT64_MAX, perFrameData[frameIndex].presentCompleteSemaphore,
nullptr );
1147 uint32_t backBufferIndex = rv.
value;
1151 device.resetFences( perFrameData[frameIndex].fence );
1154 device.resetCommandPool( perFrameData[frameIndex].commandPool );
1156 vk::CommandBuffer const & commandBuffer = perFrameData[frameIndex].commandBuffer;
1170 0,
vk::Viewport( 0.0f, 0.0f,
static_cast<float>( windowExtent.
width ),
static_cast<float>( windowExtent.
height ), 0.0f, 1.0f ) );
1175 commandBuffer.
drawIndexed( vk::su::checked_cast<uint32_t>( indices.size() ), 1, 0, 0, 0 );
1182 vk::WriteDescriptorSet writeDescriptorSet( rayTracingDescriptorSets[backBufferIndex], 1, 0, bindings[1].descriptorType, imageInfo );
1183 device.updateDescriptorSets( writeDescriptorSet,
nullptr );
1194 raygenShaderBindingOffset,
1195 shaderBindingTableBufferData.
buffer,
1196 missShaderBindingOffset,
1197 missShaderBindingStride,
1198 shaderBindingTableBufferData.
buffer,
1199 hitShaderBindingOffset,
1200 hitShaderBindingStride,
1213 commandBuffer.
end();
1216 &( perFrameData[frameIndex].presentCompleteSemaphore ),
1221 &( perFrameData[frameIndex].renderCompleteSemaphore ) ),
1222 perFrameData[frameIndex].fence );
1229 default: assert(
false );
1233 double endTime = glfwGetTime();
1234 accumulatedTime += endTime - startTime;
1236 if ( 1.0 < accumulatedTime )
1238 assert( 0 < frameCount );
1240 std::ostringstream oss;
1241 oss << AppName <<
": " << vertices.size() <<
" Vertices " << ( appInfo.
useRasterRender ?
"Rastering" :
"RayTracing" ) <<
" ( "
1242 << frameCount / accumulatedTime <<
" fps)";
1243 glfwSetWindowTitle( window, oss.str().c_str() );
1245 accumulatedTime = 0.0;
1253 shaderBindingTableBufferData.
clear( device );
1254 device.destroyPipeline( rayTracingPipeline );
1255 device.destroyPipelineLayout( rayTracingPipelineLayout );
1256 device.destroyShaderModule( closestHitShaderModule );
1257 device.destroyShaderModule( shadowMissShaderModule );
1258 device.destroyShaderModule( missShaderModule );
1259 device.destroyShaderModule( raygenShaderModule );
1260 device.freeDescriptorSets( rayTracingDescriptorPool, rayTracingDescriptorSets );
1261 device.destroyDescriptorSetLayout( rayTracingDescriptorSetLayout );
1262 device.destroyDescriptorPool( rayTracingDescriptorPool );
1263 topLevelAS.clear( device );
1264 bottomLevelAS.clear( device );
1265 device.freeDescriptorSets( descriptorPool, descriptorSet );
1266 uniformBufferData.clear( device );
1267 device.destroyPipeline( graphicsPipeline );
1268 device.destroyShaderModule( fragmentShaderModule );
1269 device.destroyShaderModule( vertexShaderModule );
1270 device.destroyPipelineLayout( pipelineLayout );
1271 device.destroyDescriptorSetLayout( descriptorSetLayout );
1272 indexBufferData.
clear( device );
1273 vertexBufferData.
clear( device );
1274 materialBufferData.
clear( device );
1275 for (
auto & texture : textures )
1277 texture.clear( device );
1279 for (
auto framebuffer : framebuffers )
1281 device.destroyFramebuffer( framebuffer );
1283 depthBufferData.
clear( device );
1284 device.destroyRenderPass( renderPass );
1285 swapChainData.
clear( device );
1286 device.destroyDescriptorPool( descriptorPool );
1289 perFrameData[i].clear( device );
1293 #if !defined( NDEBUG )
1298 glfwDestroyWindow( window );
1303 std::cout <<
"vk::SystemError: " << err.
what() << std::endl;
1306 catch ( std::exception & err )
const std::string vertexShaderText
const std::string fragmentShaderText
glm::vec3 randomVec3(float minValue, float maxValue)
#define IMGUI_VK_QUEUED_FRAMES
AccelerationStructureData createAccelerationStructureData(vk::PhysicalDevice const &physicalDevice, vk::Device const &device, vk::CommandBuffer const &commandBuffer, std::vector< std::pair< vk::AccelerationStructureNV, glm::mat4x4 >> const &instances, std::vector< vk::GeometryNV > const &geometries)
T random(T minValue=std::numeric_limits< T >::min(), T maxValue=std::numeric_limits< T >::max())
const size_t VertexStride
uint32_t roundUp(uint32_t value, uint32_t alignment)
const size_t MaterialStride
void cout(vk::SurfaceCapabilitiesKHR const &surfaceCapabilities)
void traceRaysNV(vk::Buffer raygenShaderBindingTableBuffer, vk::DeviceSize raygenShaderBindingOffset, vk::Buffer missShaderBindingTableBuffer, vk::DeviceSize missShaderBindingOffset, vk::DeviceSize missShaderBindingStride, vk::Buffer hitShaderBindingTableBuffer, vk::DeviceSize hitShaderBindingOffset, vk::DeviceSize hitShaderBindingStride, vk::Buffer callableShaderBindingTableBuffer, vk::DeviceSize callableShaderBindingOffset, vk::DeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS ResultValueType< void >::type end(Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const
void bindDescriptorSets(vk::PipelineBindPoint pipelineBindPoint, vk::PipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const vk::DescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void buildAccelerationStructureNV(const vk::AccelerationStructureInfoNV *pInfo, vk::Buffer instanceData, vk::DeviceSize instanceOffset, vk::Bool32 update, vk::AccelerationStructureNV dst, vk::AccelerationStructureNV src, vk::Buffer scratch, vk::DeviceSize scratchOffset, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void beginRenderPass(const vk::RenderPassBeginInfo *pRenderPassBegin, vk::SubpassContents contents, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void setScissor(uint32_t firstScissor, uint32_t scissorCount, const vk::Rect2D *pScissors, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result begin(const vk::CommandBufferBeginInfo *pBeginInfo, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void drawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void bindIndexBuffer(vk::Buffer buffer, vk::DeviceSize offset, vk::IndexType indexType, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void bindVertexBuffers(uint32_t firstBinding, uint32_t bindingCount, const vk::Buffer *pBuffers, const vk::DeviceSize *pOffsets, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void bindPipeline(vk::PipelineBindPoint pipelineBindPoint, vk::Pipeline pipeline, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void endRenderPass(Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void setViewport(uint32_t firstViewport, uint32_t viewportCount, const vk::Viewport *pViewports, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void pipelineBarrier(vk::PipelineStageFlags srcStageMask, vk::PipelineStageFlags dstStageMask, vk::DependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const vk::MemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const vk::BufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const vk::ImageMemoryBarrier *pImageMemoryBarriers, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyAccelerationStructureNV(vk::AccelerationStructureNV accelerationStructure, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroySemaphore(vk::Semaphore semaphore, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void getAccelerationStructureMemoryRequirementsNV(const vk::AccelerationStructureMemoryRequirementsInfoNV *pInfo, vk::MemoryRequirements2KHR *pMemoryRequirements, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void freeCommandBuffers(vk::CommandPool commandPool, uint32_t commandBufferCount, const vk::CommandBuffer *pCommandBuffers, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result createAccelerationStructureNV(const vk::AccelerationStructureCreateInfoNV *pCreateInfo, const vk::AllocationCallbacks *pAllocator, vk::AccelerationStructureNV *pAccelerationStructure, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyCommandPool(vk::CommandPool commandPool, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result getAccelerationStructureHandleNV(vk::AccelerationStructureNV accelerationStructure, size_t dataSize, void *pData, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyFence(vk::Fence fence, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result bindAccelerationStructureMemoryNV(uint32_t bindInfoCount, const vk::BindAccelerationStructureMemoryInfoNV *pBindInfos, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result createDebugUtilsMessengerEXT(const vk::DebugUtilsMessengerCreateInfoEXT *pCreateInfo, const vk::AllocationCallbacks *pAllocator, vk::DebugUtilsMessengerEXT *pMessenger, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroy(const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result enumeratePhysicalDevices(uint32_t *pPhysicalDeviceCount, vk::PhysicalDevice *pPhysicalDevices, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroySurfaceKHR(vk::SurfaceKHR surface, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyDebugUtilsMessengerEXT(vk::DebugUtilsMessengerEXT messenger, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result getSurfaceFormatsKHR(vk::SurfaceKHR surface, uint32_t *pSurfaceFormatCount, vk::SurfaceFormatKHR *pSurfaceFormats, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void getProperties2(vk::PhysicalDeviceProperties2 *pProperties, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void getFeatures2(vk::PhysicalDeviceFeatures2 *pFeatures, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result presentKHR(const vk::PresentInfoKHR *pPresentInfo, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD Result submit(uint32_t submitCount, const vk::SubmitInfo *pSubmits, vk::Fence fence, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
T & get() VULKAN_HPP_NOEXCEPT
virtual const char * what() const VULKAN_HPP_NOEXCEPT
Action mouseMove(glm::ivec2 const &position, MouseButton mouseButton, ModifierFlags &modifiers)
void setMousePosition(glm::ivec2 const &position)
glm::mat4 const & getMatrix() const
void setLookat(const glm::vec3 &cameraPosition, const glm::vec3 ¢erPosition, const glm::vec3 &upVector)
void setWindowSize(glm::ivec2 const &size)
std::vector< vk::Framebuffer > createFramebuffers(vk::Device const &device, vk::RenderPass &renderPass, std::vector< vk::ImageView > const &imageViews, vk::ImageView const &depthImageView, vk::Extent2D const &extent)
vk::DebugUtilsMessengerCreateInfoEXT makeDebugUtilsMessengerCreateInfoEXT()
vk::ShaderModule createShaderModule(vk::Device const &device, vk::ShaderStageFlagBits shaderStage, std::string const &shaderText)
vk::RenderPass createRenderPass(vk::Device const &device, vk::Format colorFormat, vk::Format depthFormat, vk::AttachmentLoadOp loadOp, vk::ImageLayout colorFinalLayout)
vk::Pipeline createGraphicsPipeline(vk::Device const &device, vk::PipelineCache const &pipelineCache, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &vertexShaderData, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &fragmentShaderData, uint32_t vertexStride, std::vector< std::pair< vk::Format, uint32_t >> const &vertexInputAttributeFormatOffset, vk::FrontFace frontFace, bool depthBuffered, vk::PipelineLayout const &pipelineLayout, vk::RenderPass const &renderPass)
void setImageLayout(vk::CommandBuffer const &commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout)
vk::Instance createInstance(std::string const &appName, std::string const &engineName, std::vector< std::string > const &layers, std::vector< std::string > const &extensions, uint32_t apiVersion)
const uint64_t FenceTimeout
vk::Device createDevice(vk::PhysicalDevice const &physicalDevice, uint32_t queueFamilyIndex, std::vector< std::string > const &extensions, vk::PhysicalDeviceFeatures const *physicalDeviceFeatures, void const *pNext)
void oneTimeSubmit(vk::Device const &device, vk::CommandPool const &commandPool, vk::Queue const &queue, Func const &func)
vk::DescriptorSetLayout createDescriptorSetLayout(vk::Device const &device, std::vector< std::tuple< vk::DescriptorType, uint32_t, vk::ShaderStageFlags >> const &bindingData, vk::DescriptorSetLayoutCreateFlags flags)
std::pair< uint32_t, uint32_t > findGraphicsAndPresentQueueFamilyIndex(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR const &surface)
void updateDescriptorSets(vk::Device const &device, vk::DescriptorSet const &descriptorSet, std::vector< std::tuple< vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const & >> const &bufferData, vk::su::TextureData const &textureData, uint32_t bindingOffset)
vk::DescriptorPool createDescriptorPool(vk::Device const &device, std::vector< vk::DescriptorPoolSize > const &poolSizes)
vk::Format pickDepthFormat(vk::PhysicalDevice const &physicalDevice)
vk::SurfaceFormatKHR pickSurfaceFormat(std::vector< vk::SurfaceFormatKHR > const &formats)
AccelerationStructureTypeKHR
@ eAccelerationStructureWriteNV
@ eAccelerationStructureReadNV
@ eDepthStencilAttachmentOptimal
@ eAccelerationStructureNV
VULKAN_HPP_INLINE std::string to_string(FormatFeatureFlags value)
Flags< FormatFeatureFlagBits > FormatFeatureFlags
@ eAccelerationStructureBuildNV
@ ePipelineCompileRequiredEXT
std::unique_ptr< vk::su::BufferData > resultBufferData
void clear(vk::Device device)
vk::AccelerationStructureNV accelerationStructure
std::unique_ptr< vk::su::BufferData > instanceBufferData
std::unique_ptr< vk::su::BufferData > scratchBufferData
vk::su::CameraManipulator cameraManipulator
uint64_t accelerationStructureHandle
GeometryInstanceData(glm::mat4x4 const &transform_, uint32_t instanceID_, uint8_t mask_, uint32_t instanceOffset_, uint8_t flags_, uint64_t accelerationStructureHandle_)
vk::Semaphore renderCompleteSemaphore
vk::CommandBuffer commandBuffer
vk::Semaphore presentCompleteSemaphore
vk::CommandPool commandPool
void clear(vk::Device device)
Vertex(glm::vec3 const &p, glm::vec3 const &n, glm::vec2 const &tc, int m=0)
vk::PhysicalDeviceFeatures features
void clear(vk::Device const &device)
void upload(vk::Device const &device, DataType const &data) const
void clear(vk::Device const &device)
vk::SwapchainKHR swapChain
std::vector< vk::ImageView > imageViews
void clear(vk::Device const &device)
std::vector< vk::Image > images
#define VK_NV_RAY_TRACING_EXTENSION_NAME
struct VkInstance_T * VkInstance
#define VK_SHADER_UNUSED_NV
#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
#define VK_QUEUE_FAMILY_IGNORED