Adding transparent geometry to ray tracing

This commit is contained in:
Dynamitos
2024-07-17 10:40:40 +02:00
parent 75e9bc899c
commit 12001152d4
6 changed files with 42 additions and 14 deletions
-1
View File
@@ -54,6 +54,5 @@ void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttribu
result = result / (result + float3(1.0)); result = result / (result + float3(1.0));
result = pow(result, float3(1.0/2.2)); result = pow(result, float3(1.0/2.2));
hitValue.color = result; hitValue.color = result;
} }
@@ -75,6 +75,24 @@ void RayTracingPass::render() {
} }
} }
} }
for (const auto& transparentData : vertexData->getTransparentData()) {
PMaterial mat = transparentData.matInst->getBaseMaterial();
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("RayTracing");
permutation.setMaterial(mat->getName());
permutation.setVertexData(vertexData->getTypeName());
const Gfx::ShaderCollection* collection = graphics->getShaderCompiler()->findShaders(Gfx::PermutationId(permutation));
assert(collection != nullptr);
Gfx::RayTracingHitGroup callableGroup = {
.closestHitShader = collection->callableShader,
};
callableGroup.parameters.resize(sizeof(VertexData::DrawCallOffsets));
std::memcpy(callableGroup.parameters.data(), &transparentData.offsets, sizeof(VertexData::DrawCallOffsets));
callableGroups.add(callableGroup);
instanceData.add(transparentData.instanceData);
accelerationStructures.add(transparentData.rayTracingScene);
}
} }
pipeline = graphics->createRayTracingPipeline(Gfx::RayTracingPipelineCreateInfo{ pipeline = graphics->createRayTracingPipeline(Gfx::RayTracingPipelineCreateInfo{
.pipelineLayout = pipelineLayout, .rayGenGroup = {.shader = rayGen}, .hitGroups = callableGroups, .missGroups = {{.shader = miss}}, .pipelineLayout = pipelineLayout, .rayGenGroup = {.shader = rayGen}, .hitGroups = callableGroups, .missGroups = {{.shader = miss}},
+14 -6
View File
@@ -20,6 +20,7 @@ void VertexData::resetMeshData() {
instanceData.clear(); instanceData.clear();
instanceMeshData.clear(); instanceMeshData.clear();
rayTracingScene.clear(); rayTracingScene.clear();
transparentData.clear();
for (auto& mat : materialData) { for (auto& mat : materialData) {
for (auto& inst : mat.instances) { for (auto& inst : mat.instances) {
inst.instanceData.clear(); inst.instanceData.clear();
@@ -47,6 +48,8 @@ void VertexData::updateMesh(entt::entity id, uint32 meshIndex, PMesh mesh, Compo
.inverseTransformMatrix = glm::inverse(transformMatrix), .inverseTransformMatrix = glm::inverse(transformMatrix),
}; };
auto [instanceId, meshletOffset] = getCullingMapping(id, meshIndex, data.numMeshlets);
referencedInstance->updateDescriptor(); referencedInstance->updateDescriptor();
if (mat->hasTransparency()) { if (mat->hasTransparency()) {
auto params = referencedInstance->getMaterialOffsets(); auto params = referencedInstance->getMaterialOffsets();
@@ -55,15 +58,16 @@ void VertexData::updateMesh(entt::entity id, uint32 meshIndex, PMesh mesh, Compo
.vertexData = this, .vertexData = this,
.offsets = .offsets =
{ {
.instanceOffset = static_cast<uint32>(instanceData.size()), .instanceOffset = 0,
.textureOffset = params.textureOffset, .textureOffset = params.textureOffset,
.samplerOffset = params.samplerOffset, .samplerOffset = params.samplerOffset,
.floatOffset = params.floatOffset, .floatOffset = params.floatOffset,
}, },
.worldPosition = Vector(inst.transformMatrix[3]), .worldPosition = Vector(inst.transformMatrix[3]),
.instanceData = inst,
.meshData = data,
.rayTracingScene = mesh->blas,
}); });
instanceData.add(inst);
instanceMeshData.add(data);
return; return;
} }
if (materialData.size() <= mat->getId()) { if (materialData.size() <= mat->getId()) {
@@ -76,9 +80,6 @@ void VertexData::updateMesh(entt::entity id, uint32 meshIndex, PMesh mesh, Compo
} }
BatchedDrawCall& matInstanceData = matData.instances[referencedInstance->getId()]; BatchedDrawCall& matInstanceData = matData.instances[referencedInstance->getId()];
matInstanceData.materialInstance = referencedInstance; matInstanceData.materialInstance = referencedInstance;
auto [instanceId, meshletOffset] = getCullingMapping(id, meshIndex, data.numMeshlets);
matInstanceData.rayTracingData.add(mesh->blas); matInstanceData.rayTracingData.add(mesh->blas);
matInstanceData.instanceData.add(inst); matInstanceData.instanceData.add(inst);
matInstanceData.instanceMeshData.add(data); matInstanceData.instanceMeshData.add(data);
@@ -146,6 +147,13 @@ void VertexData::createDescriptors() {
} }
} }
} }
for (uint32 i = 0; i < transparentData.size(); ++i)
{
transparentData[i].offsets.instanceOffset = instanceData.size();
instanceData.add(transparentData[i].instanceData);
instanceMeshData.add(transparentData[i].meshData);
rayTracingScene.add(transparentData[i].rayTracingScene);
}
cullingOffsetBuffer->rotateBuffer(cullingOffsets.size() * sizeof(uint32)); cullingOffsetBuffer->rotateBuffer(cullingOffsets.size() * sizeof(uint32));
cullingOffsetBuffer->updateContents(ShaderBufferCreateInfo{ cullingOffsetBuffer->updateContents(ShaderBufferCreateInfo{
.sourceData = .sourceData =
+3
View File
@@ -49,6 +49,9 @@ class VertexData {
VertexData* vertexData; VertexData* vertexData;
DrawCallOffsets offsets; DrawCallOffsets offsets;
Vector worldPosition; Vector worldPosition;
InstanceData instanceData;
MeshData meshData;
Gfx::PBottomLevelAS rayTracingScene;
}; };
void resetMeshData(); void resetMeshData();
void updateMesh(entt::entity id, uint32 meshIndex, PMesh mesh, Component::Transform& transform); void updateMesh(entt::entity id, uint32 meshIndex, PMesh mesh, Component::Transform& transform);
+1 -1
View File
@@ -151,7 +151,7 @@ TopLevelAS::TopLevelAS(PGraphics graphics, const Gfx::TopLevelASCreateInfo& crea
VmaAllocationCreateInfo{ VmaAllocationCreateInfo{
.usage = VMA_MEMORY_USAGE_AUTO, .usage = VMA_MEMORY_USAGE_AUTO,
}, },
Gfx::QueueType::GRAPHICS); Gfx::QueueType::GRAPHICS, graphics->getAccelerationProperties().minAccelerationStructureScratchOffsetAlignment);
VkAccelerationStructureBuildGeometryInfoKHR buildGeometry = { VkAccelerationStructureBuildGeometryInfoKHR buildGeometry = {
.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR, .sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR,
+6 -6
View File
@@ -23,12 +23,12 @@ using namespace Seele;
GameView::GameView(Gfx::PGraphics graphics, PWindow window, const ViewportCreateInfo& createInfo, std::string dllPath) GameView::GameView(Gfx::PGraphics graphics, PWindow window, const ViewportCreateInfo& createInfo, std::string dllPath)
: View(graphics, window, createInfo, "Game"), scene(new Scene(graphics)), gameInterface(dllPath) { : View(graphics, window, createInfo, "Game"), scene(new Scene(graphics)), gameInterface(dllPath) {
reloadGame(); reloadGame();
renderGraph.addPass(new CachedDepthPass(graphics, scene)); //renderGraph.addPass(new CachedDepthPass(graphics, scene));
renderGraph.addPass(new DepthCullingPass(graphics, scene)); //renderGraph.addPass(new DepthCullingPass(graphics, scene));
renderGraph.addPass(new VisibilityPass(graphics, scene)); //renderGraph.addPass(new VisibilityPass(graphics, scene));
renderGraph.addPass(new LightCullingPass(graphics, scene)); //renderGraph.addPass(new LightCullingPass(graphics, scene));
renderGraph.addPass(new BasePass(graphics, scene)); //renderGraph.addPass(new BasePass(graphics, scene));
//renderGraph.addPass(new RayTracingPass(graphics, scene)); renderGraph.addPass(new RayTracingPass(graphics, scene));
renderGraph.setViewport(viewport); renderGraph.setViewport(viewport);
renderGraph.createRenderPass(); renderGraph.createRenderPass();
} }