summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-01-21 10:17:39 -0800
committerGitHub <noreply@github.com>2022-01-21 10:17:39 -0800
commitf85bc7ae98486b37518958e659f659f1ff9b125c (patch)
treeb18f40a62ac51ee77bdf651a6d9a26f277019ab4 /examples
parent11d248293f1b56a790faadead1e3d94de81f29a2 (diff)
GFX: seperated ShaderTable. (#2090)
Diffstat (limited to 'examples')
-rw-r--r--examples/ray-tracing-pipeline/main.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/examples/ray-tracing-pipeline/main.cpp b/examples/ray-tracing-pipeline/main.cpp
index a4e6333e9..9b01d251c 100644
--- a/examples/ray-tracing-pipeline/main.cpp
+++ b/examples/ray-tracing-pipeline/main.cpp
@@ -222,6 +222,7 @@ ComPtr<gfx::IBufferResource> gTLASBuffer;
ComPtr<gfx::IAccelerationStructure> gTLAS;
ComPtr<gfx::ITextureResource> gResultTexture;
ComPtr<gfx::IResourceView> gResultTextureUAV;
+ComPtr<gfx::IShaderTable> gShaderTable;
uint64_t lastTime = 0;
@@ -521,6 +522,8 @@ Slang::Result initialize()
if (!gPresentPipelineState)
return SLANG_FAIL;
+ const char* hitgroupNames[] = {"hitgroup0", "hitgroup1"};
+
ComPtr<IShaderProgram> rayTracingProgram;
SLANG_RETURN_ON_FAIL(
loadShaderProgram(gDevice, true, rayTracingProgram.writeRef()));
@@ -529,18 +532,29 @@ Slang::Result initialize()
rtpDesc.hitGroupCount = 2;
HitGroupDesc hitGroups[2];
hitGroups[0].closestHitEntryPoint = "closestHitShader";
+ hitGroups[0].hitGroupName = hitgroupNames[0];
hitGroups[1].closestHitEntryPoint = "shadowRayHitShader";
+ hitGroups[1].hitGroupName = hitgroupNames[1];
rtpDesc.hitGroups = hitGroups;
rtpDesc.maxRayPayloadSize = 64;
rtpDesc.maxRecursion = 2;
- rtpDesc.shaderTableHitGroupCount = 2;
- int32_t shaderTable[] = {0, 1};
- rtpDesc.shaderTableHitGroupIndices = shaderTable;
SLANG_RETURN_ON_FAIL(
gDevice->createRayTracingPipelineState(rtpDesc, gRenderPipelineState.writeRef()));
if (!gRenderPipelineState)
return SLANG_FAIL;
+ IShaderTable::Desc shaderTableDesc = {};
+ const char* raygenName = "rayGenShader";
+ const char* missName = "missShader";
+ shaderTableDesc.program = rayTracingProgram;
+ shaderTableDesc.hitGroupCount = 2;
+ shaderTableDesc.hitGroupNames = hitgroupNames;
+ shaderTableDesc.rayGenShaderCount = 1;
+ shaderTableDesc.rayGenShaderEntryPointNames = &raygenName;
+ shaderTableDesc.missShaderCount = 1;
+ shaderTableDesc.missShaderEntryPointNames = &missName;
+ SLANG_RETURN_ON_FAIL(gDevice->createShaderTable(shaderTableDesc, gShaderTable.writeRef()));
+
createResultTexture();
return SLANG_OK;
}
@@ -626,7 +640,7 @@ virtual void renderFrame(int frameBufferIndex) override
cursor["uniforms"].setData(&gUniforms, sizeof(Uniforms));
cursor["sceneBVH"].setResource(gTLAS);
cursor["primitiveBuffer"].setResource(gPrimitiveBufferSRV);
- renderEncoder->dispatchRays(nullptr, windowWidth, windowHeight, 1);
+ renderEncoder->dispatchRays(0, gShaderTable, windowWidth, windowHeight, 1);
renderEncoder->endEncoding();
renderCommandBuffer->close();
gQueue->executeCommandBuffer(renderCommandBuffer);