diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 3e5b6e5fc5a0304266838b68eb8868d18f14332b..985c0fc6e4929ae61ddf668c73cdc11d2962c914 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 cd0509e787d4810209a8d36e99af6b98b9fc67ea..4accf44b2ef29a6c105fdb118e4a9fa7720a317b 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 88070f02a2779a64355ab6125a3c686b8d7df740..aa82a27d62084891971807681a0746f26f7af369 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 5f5785366bb142bf1e361c218dec7819598dc263..79636ffca734c66cd0c8055f6b55f0553eb71294 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 608b8a5ebf452d8f9eba8ea59be080c57c65ba3a..c5472e9fa0a571dc0335e309ff0d1ac0cc7e3032 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 b673921bf9e9db9b3dfc1282640a414043c805d4..6b08cfd9b517bac2b3cc5b28b5a28bbcb3cbd2e7 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 5e773669e795e5f7b60a493a9ec5e042f32fcac7..d5afaaddbc9a2e0258bb18b4835149c7c71a0a51 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 f215222327caf1c2fb070fed716188673b3d4f8d..4f37b9b211265802b11e238a1d67ecb71e4232f2 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(