static int s_GenAABBKernel ;
static int s_GenAABBKernel_Oblique ;
static int s_GenListPerTileKernel_Oblique ;
static int s_GenListPerVoxelKernelOblique ;
static int s_ClearVoxelAtomicKernel ;
static int s_ClearDispatchIndirectKernel ;
static int s_BuildDispatchIndirectKernel ;
{
{ "TileLightListGen_NoDepthRT" , "TileLightListGen_DepthRT" , "TileLightListGen_DepthRT_MSAA" } ,
{ "TileLightListGen_NoDepthRT_SrcBigTile" , "TileLightListGen_DepthRT_SrcBigTile" , "TileLightListGen_DepthRT_MSAA_SrcBigTile" }
} ;
static string [ , ] s_ClusterObliqueKernelNames = new string [ ( int ) ClusterPrepassSource . Count , ( int ) ClusterDepthSource . Count ]
{
{ "No Oblique Support for: TileLightListGen_NoDepthRT " , "TileLightListGen_DepthRT_Oblique" , "TileLightListGen_DepthRT_MSAA_Oblique" } ,
{ "No Oblique Support for: TileLightListGen_NoDepthRT_SrcBigTile" , "TileLightListGen_DepthRT_SrcBigTile_Oblique" , "TileLightListGen_DepthRT_MSAA_SrcBigTile_Oblique" }
} ;
// clustered light list specific buffers and data end
m_ReflectionPlanarProbeCache = new PlanarReflectionProbeCache ( hdAsset , iblFilterGGX , gLightLoopSettings . planarReflectionProbeCacheSize , ( int ) gLightLoopSettings . planarReflectionTextureSize , planarProbeCacheFormat , true ) ;
s_GenAABBKernel = buildScreenAABBShader . FindKernel ( "ScreenBoundsAABB" ) ;
s_GenAABBKernel_Oblique = buildScreenAABBShader . FindKernel ( "ScreenBoundsAABB_Oblique" ) ;
// The bounds and light volumes are view-dependent, and AABB is additionally projection dependent.
// The view and proj matrices are per eye in stereo. This means we have to double the size of these buffers.
s_AABBBoundsBuffer = new ComputeBuffer ( k_MaxStereoEyes * 2 * k_MaxLightsOnScreen , 3 * sizeof ( float ) ) ;
s_AABBBoundsBuffer = new ComputeBuffer ( k_MaxStereoEyes * 2 * k_MaxLightsOnScreen , 4 * sizeof ( float ) ) ;
s_ConvexBoundsBuffer = new ComputeBuffer ( k_MaxStereoEyes * k_MaxLightsOnScreen , System . Runtime . InteropServices . Marshal . SizeOf ( typeof ( SFiniteLightBound ) ) ) ;
s_LightVolumeDataBuffer = new ComputeBuffer ( k_MaxStereoEyes * k_MaxLightsOnScreen , System . Runtime . InteropServices . Marshal . SizeOf ( typeof ( LightVolumeData ) ) ) ;
s_DispatchIndirectBuffer = new ComputeBuffer ( LightDefinitions . s_NumFeatureVariants * 3 , sizeof ( uint ) , ComputeBufferType . IndirectArguments ) ;
clustDepthSourceIdx = ClusterDepthSource . Depth ;
}
var kernelName = s_ClusterKernelNames [ ( int ) clustPrepassSourceIdx , ( int ) clustDepthSourceIdx ] ;
var kernelObliqueName = s_ClusterObliqueKernelNames [ ( int ) clustPrepassSourceIdx , ( int ) clustDepthSourceIdx ] ;
s_GenListPerVoxelKernelOblique = ! kernelObliqueName . Contains ( "No Oblique Support for" )
? buildPerVoxelLightListShader . FindKernel ( kernelObliqueName )
: - 1 ;
s_GenListPerTileKernel_Oblique = buildPerTileLightListShader . FindKernel ( m_FrameSettings . lightLoopSettings . enableBigTilePrepass ? "TileLightListGen_SrcBigTile_FeatureFlags_Oblique" : "TileLightListGen_FeatureFlags_Oblique" ) ;
s_GenListPerTileKernel_Oblique = buildPerTileLightListShader . FindKernel ( m_FrameSettings . lightLoopSettings . enableBigTilePrepass ? "TileLightListGen_SrcBigTile_Oblique" : "TileLightListGen_Oblique" ) ;
}
m_CookieTexArray . NewFrame ( ) ;
void VoxelLightListGeneration ( CommandBuffer cmd , HDCamera hdCamera , Matrix4x4 [ ] projscrArr , Matrix4x4 [ ] invProjscrArr , RenderTargetIdentifier cameraDepthBufferRT )
{
Camera camera = hdCamera . camera ;
var isProjectionOblique = GeometryUtils . IsProjectionMatrixOblique ( camera . projectionMatrix ) ;
// clear atomic offset index
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_ClearVoxelAtomicKernel , HDShaderIDs . g_LayeredSingleIdxBuffer , s_GlobalLightListAtomic ) ;
cmd . DispatchCompute ( buildPerVoxelLightListShader , s_ClearVoxelAtomicKernel , 1 , 1 , 1 ) ;
cmd . SetComputeFloatParam ( buildPerVoxelLightListShader , HDShaderIDs . g_fClustScale , m_ClustScale ) ;
cmd . SetComputeFloatParam ( buildPerVoxelLightListShader , HDShaderIDs . g_fClustBase , k_ClustLogBase ) ;
cmd . SetComputeTextureParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_depth_tex , cameraDepthBufferRT ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_vLayeredLightList , s_PerVoxelLightLists ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_LayeredOffset , s_PerVoxelOffset ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_LayeredSingleIdxBuffer , s_GlobalLightListAtomic ) ;
var genListPerVoxelKernel = isProjectionOblique ? s_GenListPerVoxelKernelOblique : s_GenListPerVoxelKernel ;
cmd . SetComputeTextureParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_depth_tex , cameraDepthBufferRT ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_vLayeredLightList , s_PerVoxelLightLists ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_LayeredOffset , s_PerVoxelOffset ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_LayeredSingleIdxBuffer , s_GlobalLightListAtomic ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_vBigTileLightList , s_BigTileLightList ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_vBigTileLightList , s_BigTileLightList ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_logBaseBuffer , s_PerTileLogBaseTweak ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_logBaseBuffer , s_PerTileLogBaseTweak ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . _LightVolumeData , s_LightVolumeDataBuffer ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . _LightVolumeData , s_LightVolumeDataBuffer ) ;
cmd . SetComputeBufferParam ( buildPerVoxelLightListShader , genListPerVoxelKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
//cmd.DispatchCompute(buildPerVoxelLightListShader, s_GenListPerVoxelKernel, numTilesX, numTilesY, 1);
cmd . DispatchCompute ( buildPerVoxelLightListShader , s_GenListPerVoxelKernel , numTilesX , numTilesY , numEyes ) ;
//cmd.DispatchCompute(buildPerVoxelLightListShader, genListPerVoxelKernel, numTilesX, numTilesY, 1);
cmd . DispatchCompute ( buildPerVoxelLightListShader , genListPerVoxelKernel , numTilesX , numTilesY , numEyes ) ;
}
public void BuildGPULightListsCommon ( HDCamera hdCamera , CommandBuffer cmd , RenderTargetIdentifier cameraDepthBufferRT , RenderTargetIdentifier stencilTextureRT , bool skyEnabled )
projArr [ eyeIndex ] = CameraProjectionStereoLHS ( hdCamera . camera , ( Camera . StereoscopicEye ) eyeIndex ) ;
projscrArr [ eyeIndex ] = temp * projArr [ eyeIndex ] ;
invProjscrArr [ eyeIndex ] = projscrArr [ eyeIndex ] . inverse ;
projArr [ 0 ] = CameraProjectionNonObliqueLHS ( hdCamera ) ;
projArr [ 0 ] = GeometryUtils . GetProjectionMatrixLHS ( hdCamera . camera ) ;
var isProjectionOblique = GeometryUtils . IsProjectionMatrixOblique ( projArr [ 0 ] ) ;
// generate screen-space AABBs (used for both fptl and clustered).
if ( m_lightCount ! = 0 )
invProjhArr [ 0 ] = projhArr [ 0 ] . inverse ;
}
var genAABBKernel = isProjectionOblique ? s_GenAABBKernel_Oblique : s_GenAABBKernel ;
cmd . SetComputeBufferParam ( buildScreenAABBShader , s_GenAABBKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildScreenAABBShader , genAABBKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildScreenAABBShader , s_GenAABBKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildScreenAABBShader , genAABBKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . DispatchCompute ( buildScreenAABBShader , s_GenAABBKernel , ( m_lightCount + 7 ) / 8 , tgY , 1 ) ;
cmd . DispatchCompute ( buildScreenAABBShader , genAABBKernel , ( m_lightCount + 7 ) / 8 , tgY , 1 ) ;
}
// enable coarse 2D pass on 64x64 tiles (used for both fptl and clustered).
// optimized for opaques only
if ( m_FrameSettings . lightLoopSettings . isFptlEnabled )
{
var genListPerTileKernel = isProjectionOblique ? s_GenListPerTileKernel_Oblique : s_GenListPerTileKernel ;
cmd . SetComputeIntParam ( buildPerTileLightListShader , HDShaderIDs . g_isOrthographic , isOrthographic ? 1 : 0 ) ;
cmd . SetComputeIntParams ( buildPerTileLightListShader , HDShaderIDs . g_viDimensions , s_TempScreenDimArray ) ;
cmd . SetComputeIntParam ( buildPerTileLightListShader , HDShaderIDs . _EnvLightIndexShift , m_lightList . lights . Count ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . _LightVolumeData , s_LightVolumeDataBuffer ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . g_vBoundsBuffer , s_AABBBoundsBuffer ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . _LightVolumeData , s_LightVolumeDataBuffer ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . g_data , s_ConvexBoundsBuffer ) ;
cmd . SetComputeTextureParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . g_depth_tex , cameraDepthBufferRT ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . g_vLightList , s_LightList ) ;
cmd . SetComputeTextureParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . g_depth_tex , cameraDepthBufferRT ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . g_vLightList , s_LightList ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_GenListPerTileKernel , HDShaderIDs . g_vBigTileLightList , s_BigTileLightList ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , genListPerTileKernel , HDShaderIDs . g_vBigTileLightList , s_BigTileLightList ) ;
if ( enableFeatureVariants )
{
baseFeatureFlags | = LightDefinitions . s_MaterialFeatureMaskFlags ;
}
cmd . SetComputeIntParam ( buildPerTileLightListShader , HDShaderIDs . g_BaseFeatureFlags , ( int ) baseFeatureFlags ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , s_G enListPerTileKernel, HDShaderIDs . g_TileFeatureFlags , s_TileFeatureFlags ) ;
cmd . SetComputeBufferParam ( buildPerTileLightListShader , g enListPerTileKernel, HDShaderIDs . g_TileFeatureFlags , s_TileFeatureFlags ) ;
cmd . DispatchCompute ( buildPerTileLightListShader , s_G enListPerTileKernel, numTilesX , numTilesY , 1 ) ;
cmd . DispatchCompute ( buildPerTileLightListShader , g enListPerTileKernel, numTilesX , numTilesY , 1 ) ;
}
// Cluster