Advertisement
Guest User

blas creation

a guest
Mar 28th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 KB | None | 0 0
  1. vk::UniqueAccelerationStructureKHR RayTracing::createBottomAccelerationStructure(Mesh& mesh) {
  2.     vk::AccelerationStructureCreateGeometryTypeInfoKHR geometryTypeInfo;
  3.     geometryTypeInfo.geometryType = vk::GeometryTypeKHR::eTriangles;
  4.     geometryTypeInfo.maxPrimitiveCount = mesh.getIndexCount() / 3;
  5.     geometryTypeInfo.indexType = vk::IndexType::eUint16;
  6.     geometryTypeInfo.maxVertexCount = mesh.getVertextCount();
  7.     geometryTypeInfo.vertexFormat = vk::Format::eR32G32B32Sfloat;
  8.     geometryTypeInfo.allowsTransforms = VK_TRUE;
  9.  
  10.     vk::AccelerationStructureCreateInfoKHR createInfo;
  11.     createInfo.type = vk::AccelerationStructureTypeKHR::eBottomLevel;
  12.     createInfo.flags = vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace;
  13.     createInfo.maxGeometryCount = 1;
  14.     createInfo.pGeometryInfos = &geometryTypeInfo;
  15.  
  16.     vk::UniqueAccelerationStructureKHR accelerationStructure =
  17.         m_context->m_logicalDevice->createAccelerationStructureKHRUnique(createInfo);
  18.  
  19.     float rowMajorAffineTransformation[3][4] =
  20.     {{1.0f, 0.0f, 0.0f, 0.0f},
  21.     {0.0f, 1.0f, 0.0f, 0.0f},
  22.     {0.0f, 0.0f, 1.0f, 0.0f}};
  23.  
  24.     vk::TransformMatrixKHR transformation;
  25.     memcpy(transformation.matrix, rowMajorAffineTransformation, 3 * 4 * sizeof(float));
  26.  
  27.     vk::DeviceOrHostAddressConstKHR transformAddress;
  28.     transformAddress.hostAddress = &transformation;
  29.  
  30.     vk::AccelerationStructureGeometryTrianglesDataKHR triangleData;
  31.     triangleData.vertexFormat = vk::Format::eR32G32B32Sfloat;
  32.     triangleData.vertexData = getBufferDeviceAddress<vk::DeviceOrHostAddressConstKHR>(mesh.getVertexBuffer());
  33.     //vertex buffer holds six floats per vertex, three coordinates followed by an RBG value
  34.     triangleData.vertexStride = vk::DeviceSize(sizeof(float) * 6);
  35.     triangleData.indexType = vk::IndexType::eUint16;
  36.     triangleData.indexData = getBufferDeviceAddress<vk::DeviceOrHostAddressConstKHR>(mesh.getIndexBuffer());
  37.     triangleData.transformData = transformAddress;
  38.  
  39.     vk::AccelerationStructureGeometryDataKHR geometryData;
  40.     geometryData.triangles = triangleData;
  41.  
  42.     vk::AccelerationStructureGeometryKHR geometry;
  43.     geometry.geometryType = vk::GeometryTypeKHR::eTriangles;
  44.     geometry.geometry = geometryData;
  45.     geometry.flags = vk::GeometryFlagBitsKHR::eOpaque;
  46.  
  47.     Buffer scratchBuffer = createScratchBuffer(*accelerationStructure);
  48.  
  49.     const vk::AccelerationStructureGeometryKHR* const pGeometry = &geometry;
  50.  
  51.     vk::AccelerationStructureBuildGeometryInfoKHR geometryInfo;
  52.     geometryInfo.type = vk::AccelerationStructureTypeKHR::eBottomLevel;
  53.     geometryInfo.flags = vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace;
  54.     geometryInfo.update = VK_FALSE;
  55.     geometryInfo.srcAccelerationStructure = nullptr;
  56.     geometryInfo.dstAccelerationStructure = *accelerationStructure;
  57.     geometryInfo.geometryArrayOfPointers = VK_FALSE;
  58.     geometryInfo.geometryCount = 1;
  59.     geometryInfo.ppGeometries = &pGeometry;
  60.     geometryInfo.scratchData = getBufferDeviceAddress<vk::DeviceOrHostAddressKHR>(scratchBuffer.get());
  61.  
  62.     vk::AccelerationStructureBuildOffsetInfoKHR offsetInfo;
  63.     offsetInfo.primitiveCount = mesh.getVertextCount() / 3;
  64.     offsetInfo.primitiveOffset = 0;
  65.     offsetInfo.firstVertex = 0;
  66.     offsetInfo.transformOffset = 0;
  67.  
  68.     vk::AccelerationStructureBuildOffsetInfoKHR* pOffsetInfo = &offsetInfo;
  69.  
  70.     vk::UniqueCommandBuffer computeCmdBuffer = CmdBufferAllocator::get()->createBufferUnique(*CmdBufferAllocator::get()->m_computeCmdPool);
  71.     vk::CommandBufferBeginInfo beginInfo;
  72.     beginInfo.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit;
  73.     computeCmdBuffer->begin(beginInfo);
  74.     computeCmdBuffer->buildAccelerationStructureKHR(1, &geometryInfo, &pOffsetInfo);
  75.     computeCmdBuffer->end();
  76.  
  77.     CmdBufferAllocator::get()->submitBuffer(*computeCmdBuffer, m_context->m_computeQueue, true);
  78.  
  79.     return std::move(accelerationStructure);
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement