Adapting to buildTlas changes, fix validation warnings, members initializations

This commit is contained in:
mklefrancois 2021-08-23 13:45:20 +02:00
parent d66243800c
commit 1c9be00cec
26 changed files with 197 additions and 176 deletions

View file

@ -551,7 +551,8 @@ void HelloVulkan::createImplictBuffers()
auto cmdBuf = cmdGen.createCommandBuffer(); auto cmdBuf = cmdGen.createCommandBuffer();
m_implObjects.implBuf = m_alloc.createBuffer(cmdBuf, m_implObjects.objImpl, m_implObjects.implBuf = m_alloc.createBuffer(cmdBuf, m_implObjects.objImpl,
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR
| VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
| VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR);
m_implObjects.implMatBuf = m_alloc.createBuffer(cmdBuf, m_implObjects.implMat, m_implObjects.implMatBuf = m_alloc.createBuffer(cmdBuf, m_implObjects.implMat,
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
cmdGen.submitAndWait(cmdBuf); cmdGen.submitAndWait(cmdBuf);

View file

@ -38,10 +38,10 @@ struct ObjInstance
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call

View file

@ -156,31 +156,33 @@ void Raytracer::createBottomLevelAS(std::vector<ObjModel>& models, ImplInst& imp
void Raytracer::createTopLevelAS(std::vector<ObjInstance>& instances, ImplInst& implicitObj) void Raytracer::createTopLevelAS(std::vector<ObjInstance>& instances, ImplInst& implicitObj)
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
auto nbObj = static_cast<uint32_t>(instances.size()) - 1; // minus the implicit (for material) auto nbObj = static_cast<uint32_t>(instances.size()) - 1; // minus the implicit (for material)
tlas.reserve(instances.size()); tlas.reserve(instances.size());
for(uint32_t i = 0; i < nbObj; i++) for(uint32_t i = 0; i < nbObj; i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = instances[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(instances[i].transform); // Position of the instance
rayInst.instanceCustomId = instances[i].objIndex; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = instances[i].objIndex; // gl_InstanceCustomIndexEXT
rayInst.blasId = instances[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(instances[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
// Add the blas containing all implicit // Add the blas containing all implicit
if(!implicitObj.objImpl.empty()) if(!implicitObj.objImpl.empty())
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = implicitObj.transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(implicitObj.transform); // Position of the instance
rayInst.instanceCustomId = nbObj; // Same for material index rayInst.instanceCustomIndex = nbObj; // Same for material index
rayInst.blasId = static_cast<uint32_t>(implicitObj.blasId); rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(static_cast<uint32_t>(implicitObj.blasId));
rayInst.hitGroupId = 1; // We will use the same hit group for all objects (the second one) rayInst.instanceShaderBindingTableRecordOffset = 1; // We will use the same hit group for all objects (the second one)
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }

View file

@ -663,16 +663,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -69,10 +69,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call

View file

@ -669,16 +669,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -671,15 +671,15 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
m_tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
m_tlas.emplace_back(rayInst); m_tlas.emplace_back(rayInst);
} }
@ -888,8 +888,8 @@ void HelloVulkan::animationInstances(float time)
inst.transform = nvmath::rotation_mat4_y(i * deltaAngle + offset) * nvmath::translation_mat4(radius, 0.f, 0.f); inst.transform = nvmath::rotation_mat4_y(i * deltaAngle + offset) * nvmath::translation_mat4(radius, 0.f, 0.f);
inst.transformIT = nvmath::transpose(nvmath::invert(inst.transform)); inst.transformIT = nvmath::transpose(nvmath::invert(inst.transform));
nvvk::RaytracingBuilderKHR::Instance& tinst = m_tlas[wusonIdx]; VkAccelerationStructureInstanceKHR& tinst = m_tlas[wusonIdx];
tinst.transform = inst.transform; tinst.transform = nvvk::toTransformMatrixKHR(inst.transform);
} }
// Update the buffer // Update the buffer
@ -929,7 +929,7 @@ void HelloVulkan::animationObject(float time)
vkCmdDispatch(cmdBuf, model.nbVertices, 1, 1); vkCmdDispatch(cmdBuf, model.nbVertices, 1, 1);
genCmdBuf.submitAndWait(cmdBuf); genCmdBuf.submitAndWait(cmdBuf);
m_rtBuilder.updateBlas(2); m_rtBuilder.updateBlas(2, m_blas[2], VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR | VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR);
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

View file

@ -150,7 +150,7 @@ public:
VkPipeline m_rtPipeline; VkPipeline m_rtPipeline;
nvvk::SBTWrapper m_sbtWrapper; nvvk::SBTWrapper m_sbtWrapper;
std::vector<nvvk::RaytracingBuilderKHR::Instance> m_tlas; std::vector<VkAccelerationStructureInstanceKHR> m_tlas;
std::vector<nvvk::RaytracingBuilderKHR::BlasInput> m_blas; std::vector<nvvk::RaytracingBuilderKHR::BlasInput> m_blas;
struct RtPushConstant struct RtPushConstant

View file

@ -665,16 +665,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -69,10 +69,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call

View file

@ -700,16 +700,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -662,16 +662,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -70,10 +70,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call

View file

@ -668,16 +668,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_gltfScene.m_nodes.size()); tlas.reserve(m_gltfScene.m_nodes.size());
for(auto& node : m_gltfScene.m_nodes) for(auto& node : m_gltfScene.m_nodes)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = node.worldMatrix; rayInst.transform = nvvk::toTransformMatrixKHR(node.worldMatrix);
rayInst.instanceCustomId = node.primMesh; // gl_InstanceCustomIndexEXT: to find which primitive rayInst.instanceCustomIndex = node.primMesh; // gl_InstanceCustomIndexEXT: to find which primitive
rayInst.blasId = node.primMesh; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(node.primMesh);
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -51,10 +51,10 @@ static void onErrorCallback(int error, const char* description)
} }
// Extra UI // Extra UI
void renderUI(HelloVulkan& helloVk) void renderUI(HelloVulkan& helloVk, bool useRaytracer)
{ {
ImGuiH::CameraWidget(); ImGuiH::CameraWidget();
if(ImGui::CollapsingHeader("Light")) if( !useRaytracer && ImGui::CollapsingHeader("Light"))
{ {
ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0);
ImGui::SameLine(); ImGui::SameLine();
@ -204,9 +204,9 @@ int main(int argc, char** argv)
{ {
ImGuiH::Panel::Begin(); ImGuiH::Panel::Begin();
ImGui::ColorEdit3("Clear color", reinterpret_cast<float*>(&clearColor)); ImGui::ColorEdit3("Clear color", reinterpret_cast<float*>(&clearColor));
ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing if (ImGui::Checkbox("Ray Tracer mode", &useRaytracer)) // Switch between raster and ray tracing
helloVk.resetFrame();
renderUI(helloVk); renderUI(helloVk, useRaytracer);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled);
ImGuiH::Panel::End(); ImGuiH::Panel::End();

View file

@ -689,7 +689,7 @@ void HelloVulkan::fillLanternVerts(std::vector<nvmath::vec3f>& vertices, std::ve
for(int recursions = 0; recursions < 3; ++recursions) for(int recursions = 0; recursions < 3; ++recursions)
{ {
std::vector<Triangle> new_triangles; std::vector<Triangle> new_triangles;
for(Triangle t : triangles) for(const Triangle& t : triangles)
{ {
// Split each of three edges in half, then fixup the // Split each of three edges in half, then fixup the
// length of the midpoint to match m_lanternModelRadius. // length of the midpoint to match m_lanternModelRadius.
@ -712,8 +712,8 @@ void HelloVulkan::fillLanternVerts(std::vector<nvmath::vec3f>& vertices, std::ve
indices.reserve(triangles.size() * 3); indices.reserve(triangles.size() * 3);
// Write out the vertices to the vertices vector, and // Write out the vertices to the vertices vector, and
// connect the tesselated triangles with indices in the indices vector. // connect the tessellated triangles with indices in the indices vector.
for(Triangle t : triangles) for(const Triangle& t : triangles)
{ {
vertices[t.vert0.index] = t.vert0.vertex; vertices[t.vert0.index] = t.vert0.vertex;
vertices[t.vert1.index] = t.vert1.vertex; vertices[t.vert1.index] = t.vert1.vertex;
@ -829,30 +829,32 @@ void HelloVulkan::createTopLevelAS()
assert(m_lanternCount == 0); assert(m_lanternCount == 0);
m_lanternCount = m_lanterns.size(); m_lanternCount = m_lanterns.size();
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size() + m_lanternCount); tlas.reserve(m_objInstance.size() + m_lanternCount);
// Add the OBJ instances. // Add the OBJ instances.
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all OBJ rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
// Add lantern instances. // Add lantern instances.
for(int i = 0; i < static_cast<int>(m_lanterns.size()); ++i) for(int i = 0; i < static_cast<int>(m_lanterns.size()); ++i)
{ {
nvvk::RaytracingBuilderKHR::Instance lanternInstance; VkAccelerationStructureInstanceKHR lanternInstance;
lanternInstance.transform = nvmath::translation_mat4(m_lanterns[i].position); lanternInstance.transform = nvvk::toTransformMatrixKHR(nvmath::translation_mat4(m_lanterns[i].position));
lanternInstance.instanceCustomId = i; lanternInstance.instanceCustomIndex = i;
lanternInstance.blasId = uint32_t(m_lanternBlasId); lanternInstance.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(uint32_t(m_lanternBlasId));
lanternInstance.hitGroupId = 1; // Next hit group is for lanterns. lanternInstance.instanceShaderBindingTableRecordOffset = 1; // Next hit group is for lanterns.
lanternInstance.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; lanternInstance.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
lanternInstance.mask = 0xFF;
tlas.emplace_back(lanternInstance); tlas.emplace_back(lanternInstance);
} }

View file

@ -80,10 +80,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call
@ -101,8 +101,8 @@ public:
{ {
nvmath::vec3f position; nvmath::vec3f position;
nvmath::vec3f color; nvmath::vec3f color;
float brightness; float brightness{0};
float radius; // Max world-space distance that light illuminates. float radius{0}; // Max world-space distance that light illuminates.
}; };
// Information on each colored lantern, plus the info needed for dispatching the // Information on each colored lantern, plus the info needed for dispatching the
@ -114,8 +114,8 @@ public:
// Filled in by the device using a compute shader. // Filled in by the device using a compute shader.
// NOTE: I rely on indirectCommand being the first member. // NOTE: I rely on indirectCommand being the first member.
VkTraceRaysIndirectCommandKHR indirectCommand; VkTraceRaysIndirectCommandKHR indirectCommand;
int32_t offsetX; int32_t offsetX{0};
int32_t offsetY; int32_t offsetY{0};
// Filled in by the host. // Filled in by the host.
Lantern lantern; Lantern lantern;

View file

@ -666,16 +666,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -87,10 +87,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call

View file

@ -737,7 +737,9 @@ void HelloVulkan::createSpheres(uint32_t nbSpheres)
nvvk::CommandPool genCmdBuf(m_device, m_graphicsQueueIndex); nvvk::CommandPool genCmdBuf(m_device, m_graphicsQueueIndex);
auto cmdBuf = genCmdBuf.createCommandBuffer(); auto cmdBuf = genCmdBuf.createCommandBuffer();
m_spheresBuffer = m_alloc.createBuffer(cmdBuf, m_spheres, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); m_spheresBuffer = m_alloc.createBuffer(cmdBuf, m_spheres, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
m_spheresAabbBuffer = m_alloc.createBuffer(cmdBuf, aabbs, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); m_spheresAabbBuffer = m_alloc.createBuffer(cmdBuf, aabbs,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
| VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR);
m_spheresMatIndexBuffer = m_spheresMatIndexBuffer =
m_alloc.createBuffer(cmdBuf, matIdx, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); m_alloc.createBuffer(cmdBuf, matIdx, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
m_spheresMatColorBuffer = m_spheresMatColorBuffer =
@ -783,29 +785,31 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
auto nbObj = static_cast<uint32_t>(m_objInstance.size()) - 1; auto nbObj = static_cast<uint32_t>(m_objInstance.size()) - 1;
tlas.reserve(nbObj); tlas.reserve(nbObj);
for(uint32_t i = 0; i < nbObj; i++) for(uint32_t i = 0; i < nbObj; i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
// Add the blas containing all spheres // Add the blas containing all spheres
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[0].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[0].transform); // Position of the instance
rayInst.instanceCustomId = nbObj; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = nbObj; // gl_InstanceCustomIndexEXT
rayInst.blasId = static_cast<uint32_t>(m_objModel.size()); rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(static_cast<uint32_t>(m_objModel.size()));
rayInst.hitGroupId = 1; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 1; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }

View file

@ -69,10 +69,10 @@ public:
nvmath::mat4f transformIT{1}; // Inverse transpose nvmath::mat4f transformIT{1}; // Inverse transpose
uint32_t objIndex{0}; // Reference to the `m_objModel` uint32_t objIndex{0}; // Reference to the `m_objModel`
uint32_t txtOffset{0}; // Offset in `m_textures` uint32_t txtOffset{0}; // Offset in `m_textures`
VkDeviceAddress vertices; VkDeviceAddress vertices{0};
VkDeviceAddress indices; VkDeviceAddress indices{0};
VkDeviceAddress materials; VkDeviceAddress materials{0};
VkDeviceAddress materialIndices; VkDeviceAddress materialIndices{0};
}; };
// Information pushed at each draw call // Information pushed at each draw call
@ -162,7 +162,7 @@ public:
struct Sphere struct Sphere
{ {
nvmath::vec3f center; nvmath::vec3f center;
float radius; float radius{0};
}; };
struct Aabb struct Aabb

View file

@ -664,16 +664,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -666,16 +666,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = m_objInstance[i].hitgroup; // Using the hit group set in main rayInst.instanceShaderBindingTableRecordOffset = m_objInstance[i].hitgroup; // Using the hit group set in main
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -665,16 +665,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -663,16 +663,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);

View file

@ -665,16 +665,17 @@ void HelloVulkan::createBottomLevelAS()
void HelloVulkan::createTopLevelAS() void HelloVulkan::createTopLevelAS()
{ {
std::vector<nvvk::RaytracingBuilderKHR::Instance> tlas; std::vector<VkAccelerationStructureInstanceKHR> tlas;
tlas.reserve(m_objInstance.size()); tlas.reserve(m_objInstance.size());
for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++) for(uint32_t i = 0; i < static_cast<uint32_t>(m_objInstance.size()); i++)
{ {
nvvk::RaytracingBuilderKHR::Instance rayInst; VkAccelerationStructureInstanceKHR rayInst;
rayInst.transform = m_objInstance[i].transform; // Position of the instance rayInst.transform = nvvk::toTransformMatrixKHR(m_objInstance[i].transform); // Position of the instance
rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT rayInst.instanceCustomIndex = i; // gl_InstanceCustomIndexEXT
rayInst.blasId = m_objInstance[i].objIndex; rayInst.accelerationStructureReference = m_rtBuilder.getBlasDeviceAddress(m_objInstance[i].objIndex);
rayInst.hitGroupId = 0; // We will use the same hit group for all objects rayInst.instanceShaderBindingTableRecordOffset = 0; // We will use the same hit group for all objects
rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR;
rayInst.mask = 0xFF;
tlas.emplace_back(rayInst); tlas.emplace_back(rayInst);
} }
m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR);