Acceleration structures suck

This commit is contained in:
Dynamitos
2025-02-25 15:31:14 +01:00
parent 65bc1c78c7
commit 961cb527af
3 changed files with 11 additions and 9 deletions
+3
View File
@@ -16,6 +16,9 @@ int main()
scene->addModels(ModelLoader::loadModel("../../res/models/cube.fbx"), 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::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))); 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(); scene->generate();
Window window(1920, 1080); Window window(1920, 1080);
Camera camera = Camera{ Camera camera = Camera{
+1 -1
View File
@@ -211,7 +211,7 @@ kernel void computeKernel(
if (payload.depth > 5) if (payload.depth > 5)
{ {
if (payload.rnd01.z >= p) if (payload.rnd01.z >= p)
return; break;
else else
payload.accumulatedMaterial /= p; payload.accumulatedMaterial /= p;
} }
+7 -8
View File
@@ -40,10 +40,10 @@ void MetalScene::createRayTracingHierarchy()
MTL::AccelerationStructureTriangleGeometryDescriptor* descriptor = MTL::AccelerationStructureTriangleGeometryDescriptor::descriptor(); MTL::AccelerationStructureTriangleGeometryDescriptor* descriptor = MTL::AccelerationStructureTriangleGeometryDescriptor::descriptor();
descriptor->setTriangleCount(refs[i].numIndices / 3); descriptor->setTriangleCount(refs[i].numIndices / 3);
descriptor->setIndexBuffer(indicesBuffer); descriptor->setIndexBuffer(indicesBuffer);
descriptor->setIndexBufferOffset(refs[i].indicesOffset); descriptor->setIndexBufferOffset(refs[i].indicesOffset * sizeof(glm::uvec3));
descriptor->setVertexBufferOffset(refs[i].positionOffset);
descriptor->setVertexBuffer(positionBuffer);
descriptor->setIndexType(MTL::IndexTypeUInt32); descriptor->setIndexType(MTL::IndexTypeUInt32);
descriptor->setVertexBuffer(positionBuffer);
descriptor->setVertexBufferOffset(refs[i].positionOffset * sizeof(glm::vec3));
MTL::PrimitiveAccelerationStructureDescriptor* primitiveDescriptor = MTL::PrimitiveAccelerationStructureDescriptor::descriptor(); MTL::PrimitiveAccelerationStructureDescriptor* primitiveDescriptor = MTL::PrimitiveAccelerationStructureDescriptor::descriptor();
primitiveDescriptor->setGeometryDescriptors(NS::Array::array(descriptor)); primitiveDescriptor->setGeometryDescriptors(NS::Array::array(descriptor));
@@ -85,11 +85,9 @@ void MetalScene::createRayTracingHierarchy()
accelDesc->setInstanceDescriptorBuffer(instanceBuffer); accelDesc->setInstanceDescriptorBuffer(instanceBuffer);
accelDesc->setInstanceCount(refs.size()); accelDesc->setInstanceCount(refs.size());
accelerationStructure = device->newAccelerationStructure(accelDesc); MTL::AccelerationStructureSizes accelSizes = device->accelerationStructureSizes(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::AccelerationStructure* tempStructure = device->newAccelerationStructure(accelSizes.accelerationStructureSize); 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::Buffer* scratchBuffer = device->newBuffer(accelSizes.buildScratchBufferSize, MTL::StorageModeManaged);
MTL::CommandBuffer* cmdBuffer = queue->commandBuffer(); MTL::CommandBuffer* cmdBuffer = queue->commandBuffer();
MTL::AccelerationStructureCommandEncoder* encoder = cmdBuffer->accelerationStructureCommandEncoder(); MTL::AccelerationStructureCommandEncoder* encoder = cmdBuffer->accelerationStructureCommandEncoder();
@@ -101,10 +99,11 @@ void MetalScene::createRayTracingHierarchy()
cmdBuffer->waitUntilCompleted(); cmdBuffer->waitUntilCompleted();
uint compactedSize = *(uint*)compactedBuffer->contents(); uint compactedSize = *(uint*)compactedBuffer->contents();
accelerationStructure = device->newAccelerationStructure(compactedSize); accelerationStructure = device->newAccelerationStructure(compactedSize);
accelerationStructure->setLabel(NS::String::string("Instance AS", NS::ASCIIStringEncoding));
cmdBuffer = queue->commandBuffer(); cmdBuffer = queue->commandBuffer();
encoder = cmdBuffer->accelerationStructureCommandEncoder(); encoder = cmdBuffer->accelerationStructureCommandEncoder();
encoder->copyAndCompactAccelerationStructure(tempStructure, accelerationStructure); encoder->copyAndCompactAccelerationStructure(tempStructure, accelerationStructure);
encoder->endEncoding(); encoder->endEncoding();
cmdBuffer->commit(); cmdBuffer->commit();
cmdBuffer->waitUntilCompleted();*/ cmdBuffer->waitUntilCompleted();
} }