From a2c6e25d892c8034676a21e78058cf305c1341c6 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Tue, 29 Nov 2022 02:26:47 +0100 Subject: [PATCH] Fix building acceleration structures from static scenes Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- include/vkcv/Core.hpp | 3 ++- modules/scene/src/vkcv/scene/Mesh.cpp | 10 +++++++++- modules/scene/src/vkcv/scene/MeshPart.cpp | 12 ++++++++---- .../resources/shaders/ambientOcclusion.rchit | 5 +---- projects/rt_ambient_occlusion/src/main.cpp | 9 ++++++--- src/vkcv/AccelerationStructureManager.cpp | 12 ++++++++++-- src/vkcv/AccelerationStructureManager.hpp | 3 ++- src/vkcv/Core.cpp | 8 ++++++-- 8 files changed, 44 insertions(+), 18 deletions(-) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 3e5b6e5f..985c0fc6 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -968,7 +968,8 @@ namespace vkcv { * @return Acceleration structure handle */ AccelerationStructureHandle createAccelerationStructure( - const std::vector<GeometryData> &geometryData); + const std::vector<GeometryData> &geometryData, + const BufferHandle &transformBuffer = {}); /** * @brief Creates an acceleration structure handle built with a given list of diff --git a/modules/scene/src/vkcv/scene/Mesh.cpp b/modules/scene/src/vkcv/scene/Mesh.cpp index cd0509e7..4accf44b 100644 --- a/modules/scene/src/vkcv/scene/Mesh.cpp +++ b/modules/scene/src/vkcv/scene/Mesh.cpp @@ -138,7 +138,15 @@ namespace vkcv::scene { return; } - const AccelerationStructureHandle handle = core.createAccelerationStructure(geometryData); + const glm::mat4 transformT = glm::transpose(m_transform); + + auto transformBuffer = buffer<glm::mat4>(core, BufferType::ACCELERATION_STRUCTURE_INPUT, 1); + transformBuffer.fill(&(transformT)); + + const AccelerationStructureHandle handle = core.createAccelerationStructure( + geometryData, + transformBuffer.getHandle() + ); if (handle) { accelerationStructures.push_back(handle); diff --git a/modules/scene/src/vkcv/scene/MeshPart.cpp b/modules/scene/src/vkcv/scene/MeshPart.cpp index 88070f02..aa82a27d 100644 --- a/modules/scene/src/vkcv/scene/MeshPart.cpp +++ b/modules/scene/src/vkcv/scene/MeshPart.cpp @@ -41,9 +41,13 @@ namespace vkcv::scene { } } - const uint32_t stride = vertexGroup.numVertices > 0? static_cast<uint32_t>( - vertexGroup.vertexBuffer.data.size() / vertexGroup.numVertices - ) : 0; + uint32_t stride = 0; + for (const auto& attr : vertexGroup.vertexBuffer.attributes) { + if (attr.type == asset::PrimitiveType::POSITION) { + stride = attr.stride; + break; + } + } if ((positionAttributeIndex < m_data.getVertexBufferBindings().size()) && (stride > 0)) { @@ -89,7 +93,7 @@ namespace vkcv::scene { m_data.setCount(vertexGroup.numVertices); if (m_geometry.isValid()) { - m_geometry.setCount(vertexGroup.numIndices); + m_geometry.setCount(vertexGroup.numVertices); } } diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit index 5f578536..79636ffc 100644 --- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit +++ b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit @@ -24,8 +24,6 @@ layout(binding = 3, set = 0, scalar) buffer rtIndices void main() { payload.worldPosition = vec3(1.0, 0.0, 0.5); - payload.worldNormal = vec3(1.0 - attributes.x - attributes.y, attributes.xy); -/* ivec3 indicesVec = ivec3(indices[3 * gl_PrimitiveID + 0], indices[3 * gl_PrimitiveID + 1], indices[3 * gl_PrimitiveID + 2]); // current triangle @@ -42,8 +40,7 @@ void main() { const vec3 objectNormal = cross(v1 - v0, v2 - v0); payload.worldNormal = normalize((objectNormal * gl_WorldToObjectEXT).xyz); - payload.worldNormal = faceforward(payload.worldNormal, gl_WorldRayDirectionEXT, payload.worldNormal); -*/ + payload.hitSky = 0.0f; } diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp index 608b8a5e..c5472e9f 100644 --- a/projects/rt_ambient_occlusion/src/main.cpp +++ b/projects/rt_ambient_occlusion/src/main.cpp @@ -55,9 +55,7 @@ int main(int argc, const char** argv) { core, "../first_scene/assets/Sponza/Sponza.gltf", { - vkcv::asset::PrimitiveType::POSITION, - vkcv::asset::PrimitiveType::NORMAL, - vkcv::asset::PrimitiveType::TEXCOORD_0 + vkcv::asset::PrimitiveType::POSITION } ); @@ -67,6 +65,7 @@ int main(int argc, const char** argv) { vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle)); auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL); + auto camHandle2 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT); cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -3)); cameraManager.getCamera(camHandle).setNearFar(0.1f, 30.0f); @@ -149,6 +148,10 @@ int main(int argc, const char** argv) { raytracingPushData.camera_right = glm::vec4(glm::cross(cameraManager.getActiveCamera().getUp(), cameraManager.getActiveCamera().getFront()), 0); raytracingPushData.camera_up = glm::vec4(cameraManager.getActiveCamera().getUp(),0); raytracingPushData.camera_forward = glm::vec4(cameraManager.getActiveCamera().getFront(),0); + + raytracingPushData.camera_right = glm::normalize(raytracingPushData.camera_right); + raytracingPushData.camera_up = glm::normalize(raytracingPushData.camera_up); + raytracingPushData.camera_forward = glm::normalize(raytracingPushData.camera_forward); vkcv::PushConstants pushConstants = vkcv::pushConstants<RaytracingPushConstantData>(); pushConstants.appendDrawcall(raytracingPushData); diff --git a/src/vkcv/AccelerationStructureManager.cpp b/src/vkcv/AccelerationStructureManager.cpp index b673921b..6b08cfd9 100644 --- a/src/vkcv/AccelerationStructureManager.cpp +++ b/src/vkcv/AccelerationStructureManager.cpp @@ -235,7 +235,8 @@ namespace vkcv { } AccelerationStructureHandle AccelerationStructureManager::createAccelerationStructure( - const std::vector<GeometryData> &geometryData) { + const std::vector<GeometryData> &geometryData, + const BufferHandle &transformBuffer) { std::vector<vk::AccelerationStructureGeometryKHR> geometries; std::vector<vk::AccelerationStructureBuildGeometryInfoKHR> geometryInfos; std::vector<std::vector<vk::AccelerationStructureBuildRangeInfoKHR>> rangeInfos; @@ -253,6 +254,13 @@ namespace vkcv { auto& bufferManager = getBufferManager(); + vk::DeviceAddress transformBufferAddress; + if (transformBuffer) { + transformBufferAddress = bufferManager.getBufferDeviceAddress(transformBuffer); + } else { + transformBufferAddress = 0; + } + vk::DeviceSize accelerationStructureSize = 0; vk::DeviceSize scratchBufferSize = 0; @@ -286,7 +294,7 @@ namespace vkcv { static_cast<uint32_t>(vertexCount - 1), indexType, indexBufferAddress, - {} + transformBufferAddress ); const vk::AccelerationStructureGeometryKHR asGeometry ( diff --git a/src/vkcv/AccelerationStructureManager.hpp b/src/vkcv/AccelerationStructureManager.hpp index 5e773669..d5afaadd 100644 --- a/src/vkcv/AccelerationStructureManager.hpp +++ b/src/vkcv/AccelerationStructureManager.hpp @@ -77,7 +77,8 @@ namespace vkcv { const AccelerationStructureHandle &handle) const; [[nodiscard]] AccelerationStructureHandle createAccelerationStructure( - const std::vector<GeometryData> &geometryData); + const std::vector<GeometryData> &geometryData, + const BufferHandle &transformBuffer); [[nodiscard]] AccelerationStructureHandle createAccelerationStructure( const std::vector<AccelerationStructureHandle> &accelerationStructures); diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index f2152223..4f37b9b2 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -1352,8 +1352,12 @@ namespace vkcv { } AccelerationStructureHandle Core::createAccelerationStructure( - const std::vector<GeometryData> &geometryData) { - return m_AccelerationStructureManager->createAccelerationStructure(geometryData); + const std::vector<GeometryData> &geometryData, + const BufferHandle &transformBuffer) { + return m_AccelerationStructureManager->createAccelerationStructure( + geometryData, + transformBuffer + ); } AccelerationStructureHandle Core::createAccelerationStructure( -- GitLab