Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vk::UniqueAccelerationStructureKHR RayTracing::createBottomAccelerationStructure(Mesh& mesh) {
- vk::AccelerationStructureCreateGeometryTypeInfoKHR geometryTypeInfo;
- geometryTypeInfo.geometryType = vk::GeometryTypeKHR::eTriangles;
- geometryTypeInfo.maxPrimitiveCount = mesh.getIndexCount() / 3;
- geometryTypeInfo.indexType = vk::IndexType::eUint16;
- geometryTypeInfo.maxVertexCount = mesh.getVertextCount();
- geometryTypeInfo.vertexFormat = vk::Format::eR32G32B32Sfloat;
- geometryTypeInfo.allowsTransforms = VK_TRUE;
- vk::AccelerationStructureCreateInfoKHR createInfo;
- createInfo.type = vk::AccelerationStructureTypeKHR::eBottomLevel;
- createInfo.flags = vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace;
- createInfo.maxGeometryCount = 1;
- createInfo.pGeometryInfos = &geometryTypeInfo;
- vk::UniqueAccelerationStructureKHR accelerationStructure =
- m_context->m_logicalDevice->createAccelerationStructureKHRUnique(createInfo);
- float rowMajorAffineTransformation[3][4] =
- {{1.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 1.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 1.0f, 0.0f}};
- vk::TransformMatrixKHR transformation;
- memcpy(transformation.matrix, rowMajorAffineTransformation, 3 * 4 * sizeof(float));
- vk::DeviceOrHostAddressConstKHR transformAddress;
- transformAddress.hostAddress = &transformation;
- vk::AccelerationStructureGeometryTrianglesDataKHR triangleData;
- triangleData.vertexFormat = vk::Format::eR32G32B32Sfloat;
- triangleData.vertexData = getBufferDeviceAddress<vk::DeviceOrHostAddressConstKHR>(mesh.getVertexBuffer());
- //vertex buffer holds six floats per vertex, three coordinates followed by an RBG value
- triangleData.vertexStride = vk::DeviceSize(sizeof(float) * 6);
- triangleData.indexType = vk::IndexType::eUint16;
- triangleData.indexData = getBufferDeviceAddress<vk::DeviceOrHostAddressConstKHR>(mesh.getIndexBuffer());
- triangleData.transformData = transformAddress;
- vk::AccelerationStructureGeometryDataKHR geometryData;
- geometryData.triangles = triangleData;
- vk::AccelerationStructureGeometryKHR geometry;
- geometry.geometryType = vk::GeometryTypeKHR::eTriangles;
- geometry.geometry = geometryData;
- geometry.flags = vk::GeometryFlagBitsKHR::eOpaque;
- Buffer scratchBuffer = createScratchBuffer(*accelerationStructure);
- const vk::AccelerationStructureGeometryKHR* const pGeometry = &geometry;
- vk::AccelerationStructureBuildGeometryInfoKHR geometryInfo;
- geometryInfo.type = vk::AccelerationStructureTypeKHR::eBottomLevel;
- geometryInfo.flags = vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace;
- geometryInfo.update = VK_FALSE;
- geometryInfo.srcAccelerationStructure = nullptr;
- geometryInfo.dstAccelerationStructure = *accelerationStructure;
- geometryInfo.geometryArrayOfPointers = VK_FALSE;
- geometryInfo.geometryCount = 1;
- geometryInfo.ppGeometries = &pGeometry;
- geometryInfo.scratchData = getBufferDeviceAddress<vk::DeviceOrHostAddressKHR>(scratchBuffer.get());
- vk::AccelerationStructureBuildOffsetInfoKHR offsetInfo;
- offsetInfo.primitiveCount = mesh.getVertextCount() / 3;
- offsetInfo.primitiveOffset = 0;
- offsetInfo.firstVertex = 0;
- offsetInfo.transformOffset = 0;
- vk::AccelerationStructureBuildOffsetInfoKHR* pOffsetInfo = &offsetInfo;
- vk::UniqueCommandBuffer computeCmdBuffer = CmdBufferAllocator::get()->createBufferUnique(*CmdBufferAllocator::get()->m_computeCmdPool);
- vk::CommandBufferBeginInfo beginInfo;
- beginInfo.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit;
- computeCmdBuffer->begin(beginInfo);
- computeCmdBuffer->buildAccelerationStructureKHR(1, &geometryInfo, &pOffsetInfo);
- computeCmdBuffer->end();
- CmdBufferAllocator::get()->submitBuffer(*computeCmdBuffer, m_context->m_computeQueue, true);
- return std::move(accelerationStructure);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement