| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
- // All rights reserved.
- // Code licensed under the BSD License.
- // http://www.anki3d.org/LICENSE
- #include <AnKi/Shaders/RtShadows.hlsl>
- #include <AnKi/Shaders/Include/GpuSceneTypes.h>
- #pragma anki technique comp
- StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
- ByteAddressBuffer g_gpuScene : register(t1);
- StructuredBuffer<U32> g_visibleRenderableIndices : register(t2); // 1st element is the count
- StructuredBuffer<U32> g_shaderHandles : register(t3);
- RWStructuredBuffer<U32> g_sbtBuffer : register(u0);
- ANKI_FAST_CONSTANTS(RtShadowsSbtBuildConstants, g_consts)
- #define NUMTHREADS 64
- [numthreads(NUMTHREADS, 1, 1)] void main(U32 svDispatchThreadId : SV_DISPATCHTHREADID)
- {
- const U32 renderableCount = g_visibleRenderableIndices[0];
- if(svDispatchThreadId >= renderableCount)
- {
- return;
- }
- const GpuSceneRenderable renderable = g_renderables[g_visibleRenderableIndices[svDispatchThreadId + 1]];
- U32 sbtDwordOffset = g_consts.m_sbtRecordDwordSize * 2; // Skip raygen and miss shaders which are first
- sbtDwordOffset += g_consts.m_sbtRecordDwordSize * svDispatchThreadId;
- // Copy the handle
- for(U32 i = 0; i < g_consts.m_shaderHandleDwordSize; ++i)
- {
- g_sbtBuffer[sbtDwordOffset] = g_shaderHandles[renderable.m_rtShadowsShaderHandleIndex * g_consts.m_shaderHandleDwordSize + i];
- ++sbtDwordOffset;
- }
- // Copy the GpuScenePerDraw
- g_sbtBuffer[sbtDwordOffset++] = renderable.m_worldTransformsIndex;
- g_sbtBuffer[sbtDwordOffset++] = renderable.m_constantsOffset;
- g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsIndex;
- g_sbtBuffer[sbtDwordOffset] = 0;
- }
|