// Debugging
MaterialPropertyBlock m_SharedPropertyBlock = new MaterialPropertyBlock ( ) ;
public DebugDisplaySettings m_DebugDisplaySettings = new DebugDisplaySettings ( ) ;
DebugDisplaySettings m_DebugDisplaySettings = new DebugDisplaySettings ( ) ;
static DebugDisplaySettings s_NeutraDebugDisplaySettings = new DebugDisplaySettings ( ) ;
DebugDisplaySettings m_CurrentDebugDisplaySettings = null ;
private int m_DebugFullScreenTempRT ;
private bool m_FullScreenDebugPushed = false ;
}
// Broadcast SSS parameters to all shaders.
Shader . SetGlobalInt ( HDShaderIDs . _EnableSSSAndTransmission , m_DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission ? 1 : 0 ) ;
Shader . SetGlobalInt ( HDShaderIDs . _EnableSSSAndTransmission , m_Current DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission ? 1 : 0 ) ;
Shader . SetGlobalInt ( HDShaderIDs . _TexturingModeFlags , ( int ) sssParameters . texturingModeFlags ) ;
Shader . SetGlobalInt ( HDShaderIDs . _TransmissionFlags , ( int ) sssParameters . transmissionFlags ) ;
Shader . SetGlobalInt ( HDShaderIDs . _UseDisneySSS , sssParameters . useDisneySSS ? 1 : 0 ) ;
{
// Currently, Unity does not offer a way to bind the stencil buffer as a texture in a compute shader.
// Therefore, it's manually copied using a pixel shader.
return m_DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission | | LightLoop . GetFeatureVariantsEnabled ( m_Asset . tileSettings ) ;
return m_Current DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission | | LightLoop . GetFeatureVariantsEnabled ( m_Asset . tileSettings ) ;
}
bool NeedHTileCopy ( )
return m_DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission ;
return m_CurrentDebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission ;
}
RenderTargetIdentifier GetDepthTexture ( )
// Do anything we need to do upon a new frame.
m_LightLoop . NewFrame ( ) ;
ApplyDebugDisplaySettings ( ) ;
UpdateCommonSettings ( ) ;
// we only want to render one camera for now
// select the most main camera!
return ;
}
// If we render a reflection view or a preview we should not display any debug information
// This need to be call before ApplyDebugDisplaySettings()
if ( camera . cameraType = = CameraType . Reflection | | camera . cameraType = = CameraType . Preview )
{
// Neutral allow to disable all debug settings
m_CurrentDebugDisplaySettings = s_NeutraDebugDisplaySettings ;
}
else
{
m_CurrentDebugDisplaySettings = m_DebugDisplaySettings ;
}
ApplyDebugDisplaySettings ( ) ;
UpdateCommonSettings ( ) ;
ScriptableCullingParameters cullingParams ;
if ( ! CullResults . GetCullingParameters ( camera , out cullingParams ) )
{
m_LightLoop . UpdateCullingParameters ( ref cullingParams ) ;
#if UNITY_EDITOR
// emit scene view UI
if ( camera . cameraType = = CameraType . SceneView )
// Required for the SSS and the shader feature classification pass.
PrepareAndBindStencilTexture ( cmd ) ;
if ( m_DebugDisplaySettings . IsDebugMaterialDisplayEnabled ( ) )
if ( m_Current DebugDisplaySettings . IsDebugMaterialDisplayEnabled ( ) )
{
RenderDebugViewMaterial ( m_CullResults , hdCamera , renderContext , cmd ) ;
}
m_LightLoop . BuildGPULightLists ( camera , cmd , m_CameraDepthStencilBufferRT , GetStencilTexture ( ) ) ;
}
// Caution: We require sun light here as some sky use the sun light to render, mean UpdateSkyEnvironment
// must be call after BuildGPULightLists.
// TODO: Try to arrange code so we can trigger this call earlier and use async compute here to run sky convolution during other passes (once we move convolution shader to compute).
UpdateSkyEnvironment ( hdCamera , cmd ) ;
// Don't update the sky environment if we are rendering a cubemap (it should be update already)
if ( camera . cameraType = = CameraType . Reflection )
{
// Caution: We require sun light here as some sky use the sun light to render, mean UpdateSkyEnvironment
// must be call after BuildGPULightLists.
// TODO: Try to arrange code so we can trigger this call earlier and use async compute here to run sky convolution during other passes (once we move convolution shader to compute).
UpdateSkyEnvironment ( hdCamera , cmd ) ;
}
RenderDeferredLighting ( hdCamera , cmd ) ;
RenderForwardError ( m_CullResults , camera , renderContext , cmd , true ) ;
#endif
RenderLightingDebug ( hdCamera , cmd , m_CameraColorBufferRT , m_DebugDisplaySettings ) ;
RenderLightingDebug ( hdCamera , cmd , m_CameraColorBufferRT , m_Current DebugDisplaySettings ) ;
// If full forward rendering, we did just rendered everything, so we can copy the depth buffer
// If Deferred nothing needs copying anymore.
void RenderOpaqueRenderList ( CullResults cull , Camera camera , ScriptableRenderContext renderContext , CommandBuffer cmd , ShaderPassName [ ] passNames , RendererConfiguration rendererConfiguration = 0 , Material overrideMaterial = null )
{
if ( ! m_DebugDisplaySettings . renderingDebugSettings . displayOpaqueObjects )
if ( ! m_Current DebugDisplaySettings . renderingDebugSettings . displayOpaqueObjects )
return ;
// This is done here because DrawRenderers API lives outside command buffers so we need to make call this before doing any DrawRenders
void RenderTransparentRenderList ( CullResults cull , Camera camera , ScriptableRenderContext renderContext , CommandBuffer cmd , ShaderPassName [ ] passNames , RendererConfiguration rendererConfiguration = 0 , Material overrideMaterial = null )
{
if ( ! m_DebugDisplaySettings . renderingDebugSettings . displayTransparentObjects )
if ( ! m_Current DebugDisplaySettings . renderingDebugSettings . displayTransparentObjects )
return ;
// This is done here because DrawRenderers API lives outside command buffers so we need to make call this before doing any DrawRenders
if ( m_Asset . renderingSettings . ShouldUseForwardRenderingOnly ( ) )
return ;
using ( new Utilities . ProfilingSample ( m_DebugDisplaySettings . IsDebugDisplayEnabled ( ) ? "GBufferDebugDisplay" : "GBuffer" , cmd ) )
using ( new Utilities . ProfilingSample ( m_Current DebugDisplaySettings . IsDebugDisplayEnabled ( ) ? "GBufferDebugDisplay" : "GBuffer" , cmd ) )
RenderOpaqueRenderList ( cull , camera , renderContext , cmd , m_DebugDisplaySettings . IsDebugDisplayEnabled ( ) ? HDShaderPassNames . m_GBufferDebugDisplayName : HDShaderPassNames . m_GBufferName , Utilities . kRendererConfigurationBakedLighting ) ;
RenderOpaqueRenderList ( cull , camera , renderContext , cmd , m_Current DebugDisplaySettings . IsDebugDisplayEnabled ( ) ? HDShaderPassNames . m_GBufferDebugDisplayName : HDShaderPassNames . m_GBufferName , Utilities . kRendererConfigurationBakedLighting ) ;
}
}
{
if ( m_DebugDisplaySettings . materialDebugSettings . IsDebugGBufferEnabled ( ) & & ! m_Asset . renderingSettings . ShouldUseForwardRenderingOnly ( ) )
if ( m_Current DebugDisplaySettings . materialDebugSettings . IsDebugGBufferEnabled ( ) & & ! m_Asset . renderingSettings . ShouldUseForwardRenderingOnly ( ) )
{
using ( new Utilities . ProfilingSample ( "DebugViewMaterialGBuffer" , cmd ) )
{
LightLoop . LightingPassOptions options = new LightLoop . LightingPassOptions ( ) ;
options . volumetricLightingEnabled = m_VolumetricLightingEnabled ;
if ( m_DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission )
if ( m_Current DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission )
m_LightLoop . RenderDeferredLighting ( hdCamera , cmd , m_DebugDisplaySettings , colorRTs , m_CameraDepthStencilBufferRT , depthTexture , m_DeferredShadowBuffer , options ) ;
m_LightLoop . RenderDeferredLighting ( hdCamera , cmd , m_Current DebugDisplaySettings , colorRTs , m_CameraDepthStencilBufferRT , depthTexture , m_DeferredShadowBuffer , options ) ;
m_LightLoop . RenderDeferredLighting ( hdCamera , cmd , m_DebugDisplaySettings , colorRTs , m_CameraDepthStencilBufferRT , depthTexture , m_DeferredShadowBuffer , options ) ;
m_LightLoop . RenderDeferredLighting ( hdCamera , cmd , m_Current DebugDisplaySettings , colorRTs , m_CameraDepthStencilBufferRT , depthTexture , m_DeferredShadowBuffer , options ) ;
}
// Combines specular lighting and diffuse lighting with subsurface scattering.
if ( ! m_DebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission | | m_Asset . renderingSettings . ShouldUseForwardRenderingOnly ( ) )
if ( ! m_CurrentDebugDisplaySettings . renderingDebugSettings . enableSSSAndTransmission | | m_Asset . renderingSettings . ShouldUseForwardRenderingOnly ( ) )
return ;
using ( new Utilities . ProfilingSample ( "Subsurface Scattering" , cmd ) )
ShaderPassName passName ;
string profileName ;
if ( m_DebugDisplaySettings . IsDebugDisplayEnabled ( ) )
if ( m_Current DebugDisplaySettings . IsDebugDisplayEnabled ( ) )
{
passName = addForwardPass ? HDShaderPassNames . m_ForwardDisplayDebugName : HDShaderPassNames . m_ForwardOnlyOpaqueDisplayDebugName ;
profileName = addForwardPass ? ( renderOpaque ? "Forward Opaque Display Debug" : "Forward Transparent Display Debug" ) : "ForwardOnlyOpaqueDisplayDebug" ;
void RenderDistortion ( CullResults cullResults , Camera camera , ScriptableRenderContext renderContext , CommandBuffer cmd )
{
if ( ! m_DebugDisplaySettings . renderingDebugSettings . enableDistortion )
if ( ! m_Current DebugDisplaySettings . renderingDebugSettings . enableDistortion )
return ;
using ( new Utilities . ProfilingSample ( "Distortion" , cmd ) )
public void ApplyDebugDisplaySettings ( )
{
m_ShadowSettings . enabled = m_DebugDisplaySettings . lightingDebugSettings . enableShadows ;
m_ShadowSettings . enabled = m_Current DebugDisplaySettings . lightingDebugSettings . enableShadows ;
LightingDebugSettings lightingDebugSettings = m_DebugDisplaySettings . lightingDebugSettings ;
LightingDebugSettings lightingDebugSettings = m_Current DebugDisplaySettings . lightingDebugSettings ;
Shader . SetGlobalInt ( HDShaderIDs . _DebugViewMaterial , ( int ) m_DebugDisplaySettings . GetDebugMaterialIndex ( ) ) ;
Shader . SetGlobalInt ( HDShaderIDs . _DebugLightingMode , ( int ) m_DebugDisplaySettings . GetDebugLightingMode ( ) ) ;
Shader . SetGlobalInt ( HDShaderIDs . _DebugViewMaterial , ( int ) m_Current DebugDisplaySettings . GetDebugMaterialIndex ( ) ) ;
Shader . SetGlobalInt ( HDShaderIDs . _DebugLightingMode , ( int ) m_Current DebugDisplaySettings . GetDebugLightingMode ( ) ) ;
Shader . SetGlobalVector ( HDShaderIDs . _DebugLightingAlbedo , debugAlbedo ) ;
Shader . SetGlobalVector ( HDShaderIDs . _DebugLightingSmoothness , debugSmoothness ) ;
}
if ( debugMode = = m_DebugDisplaySettings . fullScreenDebugMode )
if ( debugMode = = m_CurrentDebugDisplaySettings . fullScreenDebugMode )
{
m_FullScreenDebugPushed = true ; // We need this flag because otherwise if no fullscreen debug is pushed, when we render the result in RenderDebug the temporary RT will not exist.
cb . GetTemporaryRT ( m_DebugFullScreenTempRT , camera . pixelWidth , camera . pixelHeight , 0 , FilterMode . Point , RenderTextureFormat . ARGBHalf , RenderTextureReadWrite . Linear ) ;
Utilities . SetRenderTarget ( cmd , BuiltinRenderTextureType . CameraTarget , m_CameraDepthStencilBufferRT ) ;
// First render full screen debug texture
if ( m_DebugDisplaySettings . fullScreenDebugMode ! = FullScreenDebugMode . None & & m_FullScreenDebugPushed )
if ( m_Current DebugDisplaySettings . fullScreenDebugMode ! = FullScreenDebugMode . None & & m_FullScreenDebugPushed )
m_DebugFullScreen . SetFloat ( HDShaderIDs . _FullScreenDebugMode , ( float ) m_DebugDisplaySettings . fullScreenDebugMode ) ;
m_DebugFullScreen . SetFloat ( HDShaderIDs . _FullScreenDebugMode , ( float ) m_Current DebugDisplaySettings . fullScreenDebugMode ) ;
float overlayRatio = m_DebugDisplaySettings . debugOverlayRatio ;
float overlayRatio = m_Current DebugDisplaySettings . debugOverlayRatio ;
LightingDebugSettings lightingDebug = m_DebugDisplaySettings . lightingDebugSettings ;
LightingDebugSettings lightingDebug = m_Current DebugDisplaySettings . lightingDebugSettings ;
if ( lightingDebug . displaySkyReflection )
{
Utilities . NextOverlayCoord ( ref x , ref y , overlaySize , overlaySize , camera . camera . pixelWidth ) ;
}
m_LightLoop . RenderDebugOverlay ( camera . camera , cmd , m_DebugDisplaySettings , ref x , ref y , overlaySize , camera . camera . pixelWidth ) ;
m_LightLoop . RenderDebugOverlay ( camera . camera , cmd , m_Current DebugDisplaySettings , ref x , ref y , overlaySize , camera . camera . pixelWidth ) ;
}
}