From 961cb527af686b6d94d66c759c6b886a2c9012f7 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Tue, 25 Feb 2025 15:31:14 +0100 Subject: [PATCH] Acceleration structures suck --- src/main.cpp | 3 +++ src/metal/Compute.metal | 2 +- src/metal/MetalScene.cpp | 15 +++++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bf12fca..12eeb7c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,6 +16,9 @@ int main() scene->addModels(ModelLoader::loadModel("../../res/models/cube.fbx"), glm::mat4(glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(0.0f, 0.0f, 0.0f, 1.0f))); + scene->addModels(ModelLoader::loadModel("../../res/models/cube.fbx"), + glm::mat4(glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), + glm::vec4(0.0f, 0.0f, 0.0f, 1.0f))); scene->generate(); Window window(1920, 1080); Camera camera = Camera{ diff --git a/src/metal/Compute.metal b/src/metal/Compute.metal index 001a090..9905e94 100644 --- a/src/metal/Compute.metal +++ b/src/metal/Compute.metal @@ -211,7 +211,7 @@ kernel void computeKernel( if (payload.depth > 5) { if (payload.rnd01.z >= p) - return; + break; else payload.accumulatedMaterial /= p; } diff --git a/src/metal/MetalScene.cpp b/src/metal/MetalScene.cpp index 2d0df4d..6ad840c 100644 --- a/src/metal/MetalScene.cpp +++ b/src/metal/MetalScene.cpp @@ -40,10 +40,10 @@ void MetalScene::createRayTracingHierarchy() MTL::AccelerationStructureTriangleGeometryDescriptor* descriptor = MTL::AccelerationStructureTriangleGeometryDescriptor::descriptor(); descriptor->setTriangleCount(refs[i].numIndices / 3); descriptor->setIndexBuffer(indicesBuffer); - descriptor->setIndexBufferOffset(refs[i].indicesOffset); - descriptor->setVertexBufferOffset(refs[i].positionOffset); - descriptor->setVertexBuffer(positionBuffer); + descriptor->setIndexBufferOffset(refs[i].indicesOffset * sizeof(glm::uvec3)); descriptor->setIndexType(MTL::IndexTypeUInt32); + descriptor->setVertexBuffer(positionBuffer); + descriptor->setVertexBufferOffset(refs[i].positionOffset * sizeof(glm::vec3)); MTL::PrimitiveAccelerationStructureDescriptor* primitiveDescriptor = MTL::PrimitiveAccelerationStructureDescriptor::descriptor(); primitiveDescriptor->setGeometryDescriptors(NS::Array::array(descriptor)); @@ -85,11 +85,9 @@ void MetalScene::createRayTracingHierarchy() accelDesc->setInstanceDescriptorBuffer(instanceBuffer); accelDesc->setInstanceCount(refs.size()); - accelerationStructure = device->newAccelerationStructure(accelDesc); - accelerationStructure->setLabel(NS::String::string("InstanceAccelerationStructure", NS::ASCIIStringEncoding)); - std::cout << accelerationStructure->debugDescription()->cString(NS::ASCIIStringEncoding) << std::endl; - /*MTL::AccelerationStructureSizes accelSizes = device->accelerationStructureSizes(accelDesc); + MTL::AccelerationStructureSizes accelSizes = device->accelerationStructureSizes(accelDesc); MTL::AccelerationStructure* tempStructure = device->newAccelerationStructure(accelSizes.accelerationStructureSize); + tempStructure->setLabel(NS::String::string("Temporary AS", NS::ASCIIStringEncoding)); MTL::Buffer* scratchBuffer = device->newBuffer(accelSizes.buildScratchBufferSize, MTL::StorageModeManaged); MTL::CommandBuffer* cmdBuffer = queue->commandBuffer(); MTL::AccelerationStructureCommandEncoder* encoder = cmdBuffer->accelerationStructureCommandEncoder(); @@ -101,10 +99,11 @@ void MetalScene::createRayTracingHierarchy() cmdBuffer->waitUntilCompleted(); uint compactedSize = *(uint*)compactedBuffer->contents(); accelerationStructure = device->newAccelerationStructure(compactedSize); + accelerationStructure->setLabel(NS::String::string("Instance AS", NS::ASCIIStringEncoding)); cmdBuffer = queue->commandBuffer(); encoder = cmdBuffer->accelerationStructureCommandEncoder(); encoder->copyAndCompactAccelerationStructure(tempStructure, accelerationStructure); encoder->endEncoding(); cmdBuffer->commit(); - cmdBuffer->waitUntilCompleted();*/ + cmdBuffer->waitUntilCompleted(); }