// Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #include #include #pragma anki technique comp StructuredBuffer g_renderables : register(t0); ByteAddressBuffer g_gpuScene : register(t1); StructuredBuffer g_visibleRenderableIndices : register(t2); // 1st element is the count StructuredBuffer g_shaderHandles : register(t3); RWStructuredBuffer 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; }