diff --git a/include/vkcv/Buffer.hpp b/include/vkcv/Buffer.hpp index 37bab6b8b1156e036f4eb17681843812e49165f5..a7dba97ef5eb02af48a6d2ee33f4cf9a410243a3 100644 --- a/include/vkcv/Buffer.hpp +++ b/include/vkcv/Buffer.hpp @@ -54,6 +54,19 @@ namespace vkcv { [[nodiscard]] BufferMemoryType getMemoryType() const { return m_core->getBufferMemoryType(m_handle); } + + /** + * @brief Returns the stride of elements in the buffer. + * + * Beware that this returned value is only the correct + * stride for this buffer if it is used tightly packed + * storing elements of type T. + * + * @return The likely stride of the #Buffer using type T + */ + [[nodiscard]] size_t getStride() const { + return sizeof(T); + } /** * @brief Returns the count of elements in the buffer. @@ -168,5 +181,10 @@ namespace vkcv { return Buffer<T>(&core, core.createBuffer(type, typeGuard<T>(), count, memoryType, readable)); } + + template <typename T> + VertexBufferBinding vertexBufferBinding(const Buffer<T>& buffer) { + return vertexBufferBinding(buffer.getHandle(), buffer.getStride()); + } } // namespace vkcv diff --git a/include/vkcv/GeometryData.hpp b/include/vkcv/GeometryData.hpp index 0dcea5be480b47f8246e47ccb55d66490ec00a20..bc8ab4eb319113691b39ada3295da93a3193582c 100644 --- a/include/vkcv/GeometryData.hpp +++ b/include/vkcv/GeometryData.hpp @@ -23,7 +23,7 @@ namespace vkcv { class GeometryData { private: VertexBufferBinding m_vertexBinding; - uint32_t m_vertexStride; + size_t m_maxVertexIndex; GeometryVertexType m_vertexType; BufferHandle m_indices; IndexBitCount m_indexBitCount; @@ -44,7 +44,7 @@ namespace vkcv { * @param[in] geometryVertexType Geometry vertex type */ explicit GeometryData(const VertexBufferBinding &binding, - uint32_t stride = sizeof(float) * 3, + size_t maxVertexIndex = 0, GeometryVertexType geometryVertexType = GeometryVertexType::POSITION_FLOAT3); @@ -77,6 +77,13 @@ namespace vkcv { */ [[nodiscard]] uint32_t getVertexStride() const; + /** + * @brief Return the maximal index from vertex elements of the geometry data. + * + * @return Maximal vertex index + */ + [[nodiscard]] size_t getMaxVertexIndex() const; + /** * @brief Return the geometry vertex type of the geometry data. * diff --git a/include/vkcv/VertexData.hpp b/include/vkcv/VertexData.hpp index 845b9fba9a646d702377c297112029944a254f17..a9928a4dc66779d3747b74d54269fff731776c94 100644 --- a/include/vkcv/VertexData.hpp +++ b/include/vkcv/VertexData.hpp @@ -15,11 +15,23 @@ namespace vkcv { * @brief Structure to store details about a vertex buffer binding. */ struct VertexBufferBinding { - BufferHandle buffer; - size_t offset; + BufferHandle m_buffer; + size_t m_stride; + size_t m_offset; }; - VertexBufferBinding vertexBufferBinding(const BufferHandle &buffer, size_t offset = 0); + /** + * Create a vertex buffer binding using a given buffer handle and + * its stride in bytes. + * + * @param[in] buffer Vertex buffer + * @param[in] stride Stride in bytes + * @param[in] offset (Optional) Offset in bytes + * @return Vertex buffer binding + */ + VertexBufferBinding vertexBufferBinding(const BufferHandle &buffer, + size_t stride, + size_t offset = 0); typedef std::vector<VertexBufferBinding> VertexBufferBindings; diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp index ef83785e6a7280dc7e6e45a850915f2ad4fc56c1..f924ea7314dc929713f624bda3841452c6fa6c6b 100644 --- a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp +++ b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp @@ -885,7 +885,11 @@ namespace vkcv::asset { break; } - bindings.push_back(vkcv::vertexBufferBinding(buffer, attribute->offset)); + bindings.push_back(vkcv::vertexBufferBinding( + buffer, + attribute->stride, + attribute->offset + )); } return bindings; diff --git a/modules/geometry/include/vkcv/geometry/Geometry.hpp b/modules/geometry/include/vkcv/geometry/Geometry.hpp index ea006b009e45c3147b914890039f7a86bf39e519..b7be4eb898b1c5b0987428efd3c5ce10809a6f0e 100644 --- a/modules/geometry/include/vkcv/geometry/Geometry.hpp +++ b/modules/geometry/include/vkcv/geometry/Geometry.hpp @@ -116,11 +116,12 @@ namespace vkcv::geometry { * generated vertex data, which can be used for * building bottom level acceleration structures. * + * @param[in,out] core Core instance * @param[in, out] vertexData Vertex data with generated geometry * @return Geometry data from generated vertex data */ [[nodiscard]] - virtual GeometryData extractGeometryData(const VertexData &vertexData) const; + virtual GeometryData extractGeometryData(Core& core, const VertexData &vertexData) const; }; diff --git a/modules/geometry/src/vkcv/geometry/Cuboid.cpp b/modules/geometry/src/vkcv/geometry/Cuboid.cpp index 73a701b2826a7694201304b029c91af3e7191e5c..a5b625253ffac638a89f31d5a245a6064696031e 100644 --- a/modules/geometry/src/vkcv/geometry/Cuboid.cpp +++ b/modules/geometry/src/vkcv/geometry/Cuboid.cpp @@ -219,10 +219,10 @@ namespace vkcv::geometry { tangentBuffer.fill(cuboidTangents); VertexData data ({ - vkcv::vertexBufferBinding(positionBuffer.getHandle()), - vkcv::vertexBufferBinding(normalBuffer.getHandle()), - vkcv::vertexBufferBinding(uvBuffer.getHandle()), - vkcv::vertexBufferBinding(tangentBuffer.getHandle()) + vkcv::vertexBufferBinding(positionBuffer.getHandle(), sizeof(float) * 3), + vkcv::vertexBufferBinding(normalBuffer.getHandle(), sizeof(float) * 3), + vkcv::vertexBufferBinding(uvBuffer.getHandle(), sizeof(float) * 2), + vkcv::vertexBufferBinding(tangentBuffer) }); const auto& featureManager = core.getContext().getFeatureManager(); diff --git a/modules/geometry/src/vkcv/geometry/Cylinder.cpp b/modules/geometry/src/vkcv/geometry/Cylinder.cpp index 0583c4c134922f16ed00d8ff36f81c027051bb90..5705219914fe90b1442a546a72cb3f4cabbe16d9 100644 --- a/modules/geometry/src/vkcv/geometry/Cylinder.cpp +++ b/modules/geometry/src/vkcv/geometry/Cylinder.cpp @@ -177,10 +177,10 @@ namespace vkcv::geometry { indexBuffer.fill(cylinderIndices); VertexData data ({ - vkcv::vertexBufferBinding(positionBuffer.getHandle()), - vkcv::vertexBufferBinding(normalBuffer.getHandle()), - vkcv::vertexBufferBinding(uvBuffer.getHandle()), - vkcv::vertexBufferBinding(tangentBuffer.getHandle()) + vkcv::vertexBufferBinding(positionBuffer), + vkcv::vertexBufferBinding(normalBuffer), + vkcv::vertexBufferBinding(uvBuffer), + vkcv::vertexBufferBinding(tangentBuffer) }); data.setIndexBuffer(indexBuffer.getHandle(), IndexBitCount::Bit32); diff --git a/modules/geometry/src/vkcv/geometry/Geometry.cpp b/modules/geometry/src/vkcv/geometry/Geometry.cpp index ec0d56e06ccf9d5cf5d9dd92192f930715adc055..82e1b6b38e275bdce1ae18b43c8e5f1419905f5c 100644 --- a/modules/geometry/src/vkcv/geometry/Geometry.cpp +++ b/modules/geometry/src/vkcv/geometry/Geometry.cpp @@ -28,10 +28,24 @@ namespace vkcv::geometry { )); } - GeometryData Geometry::extractGeometryData(const vkcv::VertexData &vertexData) const { + GeometryData Geometry::extractGeometryData(Core& core, + const vkcv::VertexData &vertexData) const { + const VertexBufferBinding positionBufferBinding = vertexData.getVertexBufferBindings()[0]; + const size_t bufferSize = core.getBufferSize(positionBufferBinding.m_buffer); + + if (positionBufferBinding.m_stride < sizeof(float) * 3) { + return {}; + } + + const size_t vertexCount = (bufferSize / positionBufferBinding.m_stride); + + if (vertexCount < 3) { + return {}; + } + GeometryData data ( - vertexData.getVertexBufferBindings()[0], - sizeof(glm::vec3), + positionBufferBinding, + vertexCount - 1, GeometryVertexType::POSITION_FLOAT3 ); diff --git a/modules/geometry/src/vkcv/geometry/Sphere.cpp b/modules/geometry/src/vkcv/geometry/Sphere.cpp index d516a1dad4e11651e4ad6d6c056dcf9442d29f18..f6bd894af080a5e3d0ea2eaaf182c85afafd6a39 100644 --- a/modules/geometry/src/vkcv/geometry/Sphere.cpp +++ b/modules/geometry/src/vkcv/geometry/Sphere.cpp @@ -137,10 +137,10 @@ namespace vkcv::geometry { indexBuffer.fill(sphereIndices); VertexData data ({ - vkcv::vertexBufferBinding(positionBuffer.getHandle()), - vkcv::vertexBufferBinding(normalBuffer.getHandle()), - vkcv::vertexBufferBinding(uvBuffer.getHandle()), - vkcv::vertexBufferBinding(tangentBuffer.getHandle()) + vkcv::vertexBufferBinding(positionBuffer), + vkcv::vertexBufferBinding(normalBuffer), + vkcv::vertexBufferBinding(uvBuffer), + vkcv::vertexBufferBinding(tangentBuffer) }); data.setIndexBuffer(indexBuffer.getHandle(), IndexBitCount::Bit32); diff --git a/modules/geometry/src/vkcv/geometry/Teapot.cpp b/modules/geometry/src/vkcv/geometry/Teapot.cpp index 7becdef5941769c79da0b0b17a45ec3e5d0a1cb6..8d8b4624bc052bcfc0599408faef202e73d041ca 100644 --- a/modules/geometry/src/vkcv/geometry/Teapot.cpp +++ b/modules/geometry/src/vkcv/geometry/Teapot.cpp @@ -14934,10 +14934,10 @@ namespace vkcv::geometry { indexBuffer.fill(teapotIndices); VertexData data ({ - vkcv::vertexBufferBinding(positionBuffer.getHandle()), - vkcv::vertexBufferBinding(normalBuffer.getHandle()), - vkcv::vertexBufferBinding(uvBuffer.getHandle()), - vkcv::vertexBufferBinding(tangentBuffer.getHandle()) + vkcv::vertexBufferBinding(positionBuffer.getHandle(), sizeof(float) * 3), + vkcv::vertexBufferBinding(normalBuffer.getHandle(), sizeof(float) * 3), + vkcv::vertexBufferBinding(uvBuffer.getHandle(), sizeof(float) * 2), + vkcv::vertexBufferBinding(tangentBuffer) }); data.setIndexBuffer(indexBuffer.getHandle()); diff --git a/modules/scene/src/vkcv/scene/MeshPart.cpp b/modules/scene/src/vkcv/scene/MeshPart.cpp index aa82a27d62084891971807681a0746f26f7af369..ec5a518287691a0cbae0adcdf7cf57e2ccc4f916 100644 --- a/modules/scene/src/vkcv/scene/MeshPart.cpp +++ b/modules/scene/src/vkcv/scene/MeshPart.cpp @@ -41,19 +41,10 @@ namespace vkcv::scene { } } - 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)) { + if (positionAttributeIndex < m_data.getVertexBufferBindings().size()) { m_geometry = GeometryData( m_data.getVertexBufferBindings()[positionAttributeIndex], - stride, + vertexGroup.numVertices - 1, GeometryVertexType::POSITION_FLOAT3 ); } diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp index 51e29ed5b13182a20e5a069247222a48fe0c90ef..2bec78711c12a221fd7e82da06af6d87ee5be0fe 100644 --- a/projects/fire_works/src/main.cpp +++ b/projects/fire_works/src/main.cpp @@ -580,7 +580,7 @@ int main(int argc, const char **argv) { 1, 4, 0 }); - vkcv::VertexData cubeData ({ vkcv::vertexBufferBinding(cubePositions.getHandle()) }); + vkcv::VertexData cubeData ({ vkcv::vertexBufferBinding(cubePositions) }); cubeData.setIndexBuffer(cubeIndices.getHandle()); cubeData.setCount(cubeIndices.getCount()); @@ -653,7 +653,7 @@ int main(int argc, const char **argv) { 0, 1, 2 }); - vkcv::VertexData triangleData ({ vkcv::vertexBufferBinding(trianglePositions.getHandle()) }); + vkcv::VertexData triangleData ({ vkcv::vertexBufferBinding(trianglePositions) }); triangleData.setIndexBuffer(triangleIndices.getHandle()); triangleData.setCount(triangleIndices.getCount()); diff --git a/projects/indirect_draw/src/main.cpp b/projects/indirect_draw/src/main.cpp index f90fa0892982f68fa959671b5eb6f207aac72b65..5f40732f2ebe5b0021f59756373c623172537da8 100644 --- a/projects/indirect_draw/src/main.cpp +++ b/projects/indirect_draw/src/main.cpp @@ -436,7 +436,7 @@ int main(int argc, const char** argv) { modelBuffer.fill(modelMatrix); const std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = { - vkcv::vertexBufferBinding(vkCompiledVertexBuffer.getHandle()) + vkcv::vertexBufferBinding(vkCompiledVertexBuffer) }; vkcv::VertexData vertexData (vertexBufferBindings); diff --git a/projects/mpm/src/main.cpp b/projects/mpm/src/main.cpp index 61f27daa9b011b1952ce640653483c8de730eb74..fa9c908c7f05465100b67232729b1ed13663ef0e 100644 --- a/projects/mpm/src/main.cpp +++ b/projects/mpm/src/main.cpp @@ -550,7 +550,7 @@ int main(int argc, const char **argv) { glm::vec2(+1.0f, -1.0f) }); - vkcv::VertexData triangleData ({ vkcv::vertexBufferBinding(trianglePositions.getHandle()) }); + vkcv::VertexData triangleData ({ vkcv::vertexBufferBinding(trianglePositions) }); triangleData.setCount(trianglePositions.getCount()); vkcv::Buffer<glm::vec3> linesPositions = vkcv::buffer<glm::vec3>(core, vkcv::BufferType::VERTEX, 8); @@ -583,7 +583,7 @@ int main(int argc, const char **argv) { 3, 7 }); - vkcv::VertexData linesData ({ vkcv::vertexBufferBinding(linesPositions.getHandle()) }); + vkcv::VertexData linesData ({ vkcv::vertexBufferBinding(linesPositions) }); linesData.setIndexBuffer(linesIndices.getHandle()); linesData.setCount(linesIndices.getCount()); diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index 72249ee3e993b4f903220f496975ff7ae7328af4..7f270706eb2e385c539af4cdd6cb7eca3236b138 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -98,7 +98,7 @@ int main(int argc, const char **argv) { const std::vector<vkcv::VertexAttachment> vertexAttachments = particleShaderProgram.getVertexAttachments(); const std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = { - vkcv::vertexBufferBinding(vertexBuffer.getHandle()) + vkcv::vertexBufferBinding(vertexBuffer) }; std::vector<vkcv::VertexBinding> bindings; diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit index 79636ffca734c66cd0c8055f6b55f0553eb71294..9bc4f664e57b26c08ffe759258aa11995e01c883 100644 --- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit +++ b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit @@ -9,6 +9,7 @@ layout(location = 0) rayPayloadInEXT Payload { float hitSky; vec3 worldPosition; vec3 worldNormal; + uvec4 hit; } payload; layout(binding = 2, set = 0, scalar) buffer rtVertices @@ -24,6 +25,13 @@ layout(binding = 3, set = 0, scalar) buffer rtIndices void main() { payload.worldPosition = vec3(1.0, 0.0, 0.5); + payload.hit = uvec4( + gl_PrimitiveID, + gl_InstanceID, + gl_InstanceCustomIndexEXT, + gl_GeometryIndexEXT + ); + ivec3 indicesVec = ivec3(indices[3 * gl_PrimitiveID + 0], indices[3 * gl_PrimitiveID + 1], indices[3 * gl_PrimitiveID + 2]); // current triangle diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen index 711070fcf1eec18253f331cbd133330791fa6be6..41061e0e40fb9cde2f80e76fbe0bd313cdafe1cd 100644 --- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen +++ b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen @@ -8,6 +8,7 @@ layout(location = 0) rayPayloadEXT Payload { float hitSky; vec3 worldPosition; vec3 worldNormal; + uvec4 hit; } payload; layout(binding = 0, set = 0, rgba16) uniform image2D outImg; // the output image -> maybe use 16 bit values? @@ -49,14 +50,18 @@ vec2 random(){ * @param[in,out] pos The position of intersection * @param[in,out] norm The normal at the position of intersection */ -void TraceCameraRay(out bool hitSky, out vec3 pos, out vec3 norm){ +void TraceCameraRay(out bool hitSky, out vec3 pos, out vec3 norm, out uvec4 hit){ // Use a camera model to generate a ray for this pixel. vec2 uv = gl_LaunchIDEXT.xy + vec2(random()); // random breaks up aliasing uv /= vec2(gl_LaunchSizeEXT.xy); uv = (uv * 2.0 - 1.0) // normalize uv coordinates into Vulkan viewport space * vec2(1.0, -1.0); // flips y-axis const vec3 orig = camera.camera_position.xyz; - const vec3 dir = normalize(uv.x * camera.camera_right + uv.y * camera.camera_up + camera.camera_forward).xyz; + const vec3 dir = normalize( + uv.x * camera.camera_right + + uv.y * camera.camera_up + + camera.camera_forward + ).xyz; // Trace a ray into the scene; get back data in the payload. traceRayEXT(tlas, // Acceleration structure @@ -75,6 +80,7 @@ void TraceCameraRay(out bool hitSky, out vec3 pos, out vec3 norm){ hitSky = (payload.hitSky > 0.0); pos = payload.worldPosition; norm = payload.worldNormal; + hit = payload.hit; } /** @@ -137,7 +143,8 @@ void main(){ uvec2 pixel = gl_LaunchIDEXT.xy; bool pixelIsSky; // Does the pixel show the sky (not an object)? vec3 pos, norm; // AO rays from where? - TraceCameraRay(pixelIsSky, pos, norm); + uvec4 hit; + TraceCameraRay(pixelIsSky, pos, norm, hit); if(pixelIsSky){ // Don't compute ambient occlusion for the sky @@ -145,6 +152,12 @@ void main(){ return; } + imageStore(outImg, ivec2(pixel), vec4(vec3( + 0,//float(hit.x) / 0xFFFF, + 0,//float(hit.y) / 381, + hit.z > 0 || hit.w > 0? 1 : 0 + ), 1)); +/* // Compute ambient occlusion float aoValue = 0.0; for(uint i = 0; i < rayCount; i++){ @@ -155,4 +168,5 @@ void main(){ aoValue /= rayCount; imageStore(outImg, ivec2(pixel), vec4(vec3(aoValue), 1)); +*/ } diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss index c107dbd03e6a8fdfdd84d2b8d280cb6264307c14..5c97ae901074d642f24ab5ae918b8b64ea0140d5 100644 --- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss +++ b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss @@ -5,6 +5,7 @@ layout(location = 0) rayPayloadInEXT Payload { float hitSky; vec3 worldPosition; vec3 worldNormal; + uvec4 hit; } payload; void main() { diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp index ce6c89a31044c9360e66491fc0a847a84784debd..7c77334bf2efd0e80a3aa7cb2f6ffe4ec3611703 100644 --- a/projects/rt_ambient_occlusion/src/main.cpp +++ b/projects/rt_ambient_occlusion/src/main.cpp @@ -61,7 +61,7 @@ int main(int argc, const char** argv) { vkcv::geometry::Teapot teapot (glm::vec3(0.0f), 1.0f); vkcv::VertexData vertexData = teapot.generateVertexData(core); - vkcv::GeometryData geometryData = teapot.extractGeometryData(vertexData); + vkcv::GeometryData geometryData = teapot.extractGeometryData(core, vertexData); vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle)); auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL); @@ -104,7 +104,7 @@ int main(int argc, const char** argv) { { vkcv::DescriptorWrites writes; writes.writeAcceleration(1, { core.getVulkanAccelerationStructure(scene_tlas) }); - writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().buffer); + writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().m_buffer); writes.writeStorageBuffer(3, geometryData.getIndexBuffer()); core.writeDescriptorSet(descriptorSetHandles[0], writes); } diff --git a/projects/sph/src/main.cpp b/projects/sph/src/main.cpp index 989201a996757e79f8fe29e78f8517c1354a14dc..904d9e8965e41914271afb0ac31853b1581f6ca7 100644 --- a/projects/sph/src/main.cpp +++ b/projects/sph/src/main.cpp @@ -96,7 +96,7 @@ int main(int argc, const char **argv) { const std::vector<vkcv::VertexAttachment> vertexAttachments = particleShaderProgram.getVertexAttachments(); const std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = { - vkcv::vertexBufferBinding(vertexBuffer.getHandle()) + vkcv::vertexBufferBinding(vertexBuffer) }; std::vector<vkcv::VertexBinding> bindings; diff --git a/src/vkcv/AccelerationStructureManager.cpp b/src/vkcv/AccelerationStructureManager.cpp index 6b08cfd9b517bac2b3cc5b28b5a28bbcb3cbd2e7..5a31fbd0ceeda43a29f9143db01ee488aa018dc1 100644 --- a/src/vkcv/AccelerationStructureManager.cpp +++ b/src/vkcv/AccelerationStructureManager.cpp @@ -270,19 +270,15 @@ namespace vkcv { for (const GeometryData &data : geometryData) { const auto vertexBufferAddress = bufferManager.getBufferDeviceAddress( - data.getVertexBufferBinding().buffer - ) + data.getVertexBufferBinding().offset; + data.getVertexBufferBinding().m_buffer + ) + data.getVertexBufferBinding().m_offset; const auto indexBufferAddress = bufferManager.getBufferDeviceAddress( data.getIndexBuffer() ); const auto vertexStride = data.getVertexStride(); - const auto vertexBufferSize = bufferManager.getBufferSize( - data.getVertexBufferBinding().buffer - ); - - const auto vertexCount = (vertexBufferSize / vertexStride); + const auto maxVertex = data.getMaxVertexIndex(); const vk::Format vertexFormat = getVertexFormat(data.getGeometryVertexType()); const vk::IndexType indexType = getIndexType(data.getIndexBitCount()); @@ -291,7 +287,7 @@ namespace vkcv { vertexFormat, vertexBufferAddress, vertexStride, - static_cast<uint32_t>(vertexCount - 1), + static_cast<uint32_t>(maxVertex), indexType, indexBufferAddress, transformBufferAddress diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 4f37b9b211265802b11e238a1d67ecb71e4232f2..142f4fff8abe0fbb9888a5807099187b11331eda 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -382,15 +382,21 @@ namespace vkcv { for (uint32_t i = 0; i < vertexData.getVertexBufferBindings().size(); i++) { const auto &vertexBinding = vertexData.getVertexBufferBindings() [i]; - cmdBuffer.bindVertexBuffers(i, bufferManager.getBuffer(vertexBinding.buffer), - vertexBinding.offset); + cmdBuffer.bindVertexBuffers( + i, + bufferManager.getBuffer(vertexBinding.m_buffer), + vertexBinding.m_offset + ); } for (const auto &usage : drawcall.getDescriptorSetUsages()) { cmdBuffer.bindDescriptorSets( - vk::PipelineBindPoint::eGraphics, pipelineLayout, usage.location, + vk::PipelineBindPoint::eGraphics, + pipelineLayout, + usage.location, descriptorSetManager.getDescriptorSet(usage.descriptorSet).vulkanHandle, - usage.dynamicOffsets); + usage.dynamicOffsets + ); } if (pushConstants.getSizePerDrawcall() > 0) { @@ -534,8 +540,11 @@ namespace vkcv { for (uint32_t i = 0; i < vertexData.getVertexBufferBindings().size(); i++) { const auto &vertexBinding = vertexData.getVertexBufferBindings() [i]; - cmdBuffer.bindVertexBuffers(i, bufferManager.getBuffer(vertexBinding.buffer), - vertexBinding.offset); + cmdBuffer.bindVertexBuffers( + i, + bufferManager.getBuffer(vertexBinding.m_buffer), + vertexBinding.m_offset + ); } if (pushConstantData.getSizePerDrawcall() > 0) { diff --git a/src/vkcv/GeometryData.cpp b/src/vkcv/GeometryData.cpp index 35d2912826842214154260b5c3fe98b1630e5b58..1274f752b423116ad4a96d86b984164d09797964 100644 --- a/src/vkcv/GeometryData.cpp +++ b/src/vkcv/GeometryData.cpp @@ -5,17 +5,17 @@ namespace vkcv { GeometryData::GeometryData() : m_vertexBinding({}), - m_vertexStride(0), + m_maxVertexIndex(0), m_vertexType(GeometryVertexType::UNDEFINED), m_indices(), m_indexBitCount(IndexBitCount::Bit16), m_count(0) {} GeometryData::GeometryData(const VertexBufferBinding &binding, - uint32_t stride, + size_t maxVertexIndex, GeometryVertexType geometryVertexType) : m_vertexBinding(binding), - m_vertexStride(stride), + m_maxVertexIndex(maxVertexIndex), m_vertexType(geometryVertexType), m_indices(), m_indexBitCount(IndexBitCount::Bit16), @@ -30,7 +30,11 @@ namespace vkcv { } uint32_t GeometryData::getVertexStride() const { - return m_vertexStride; + return m_vertexBinding.m_stride; + } + + size_t GeometryData::getMaxVertexIndex() const { + return m_maxVertexIndex; } GeometryVertexType GeometryData::getGeometryVertexType() const { diff --git a/src/vkcv/VertexData.cpp b/src/vkcv/VertexData.cpp index a1fcfb3692fcc6051e237e759ce29c38e4c688f4..70c99059b8063f8307e4ba48c98776b5025de443 100644 --- a/src/vkcv/VertexData.cpp +++ b/src/vkcv/VertexData.cpp @@ -3,10 +3,13 @@ namespace vkcv { - VertexBufferBinding vertexBufferBinding(const BufferHandle &buffer, size_t offset) { + VertexBufferBinding vertexBufferBinding(const BufferHandle &buffer, + size_t stride, + size_t offset) { VertexBufferBinding binding; - binding.buffer = buffer; - binding.offset = offset; + binding.m_buffer = buffer; + binding.m_stride = stride; + binding.m_offset = offset; return binding; }