Files
XCEngine/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneBlock.cs

143 lines
4.4 KiB
C#

using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
internal sealed class UniversalMainSceneBlock
{
private const string kMainLightShadowsKeyword =
"XC_MAIN_LIGHT_SHADOWS";
private readonly DrawObjectsPass m_drawOpaqueObjectsPass =
new DrawObjectsPass(
RenderPassEvent.RenderOpaques,
SceneRenderPhase.Opaque,
RendererListDesc.CreateDefault(
RendererListType.Opaque));
private readonly DrawSkyboxPass m_drawSkyboxPass =
new DrawSkyboxPass();
private readonly DrawObjectsPass m_drawTransparentObjectsPass =
new DrawObjectsPass(
RenderPassEvent.RenderTransparents,
SceneRenderPhase.Transparent,
RendererListDesc.CreateDefault(
RendererListType.Transparent));
public void ConfigureRenderSceneSetup(
RenderSceneSetupContext context)
{
if (context == null)
{
return;
}
context.SetEnvironmentNone();
context.ClearGlobalShaderKeywords();
Camera camera = context.camera;
if (ShouldUseSkyboxEnvironment(
context,
camera))
{
if (camera.hasSkyboxMaterial)
{
context.UseCameraSkyboxMaterial();
}
else
{
context.SetProceduralSkybox(
camera.skyboxTopColor,
camera.skyboxHorizonColor,
camera.skyboxBottomColor);
}
}
context.SetGlobalShaderKeyword(
kMainLightShadowsKeyword,
context.hasMainDirectionalShadow);
}
public void EnqueueRenderPasses(
ScriptableRenderer renderer,
UniversalMainSceneData mainScene)
{
if (renderer == null ||
mainScene == null)
{
return;
}
if (mainScene.renderOpaque)
{
EnqueueOpaquePasses(
renderer,
mainScene);
}
if (mainScene.renderSkybox)
{
EnqueueSkyboxPasses(
renderer,
mainScene);
}
if (mainScene.renderTransparent)
{
EnqueueTransparentPasses(
renderer,
mainScene);
}
}
private void EnqueueOpaquePasses(
ScriptableRenderer renderer,
UniversalMainSceneData mainScene)
{
m_drawOpaqueObjectsPass.Configure(
mainScene.opaquePassEvent,
SceneRenderPhase.Opaque,
mainScene.opaqueRendererListDesc,
mainScene.opaqueDrawingSettings);
renderer.EnqueuePass(m_drawOpaqueObjectsPass);
}
private void EnqueueSkyboxPasses(
ScriptableRenderer renderer,
UniversalMainSceneData mainScene)
{
m_drawSkyboxPass.Configure(
mainScene.skyboxPassEvent);
renderer.EnqueuePass(m_drawSkyboxPass);
}
private void EnqueueTransparentPasses(
ScriptableRenderer renderer,
UniversalMainSceneData mainScene)
{
m_drawTransparentObjectsPass.Configure(
mainScene.transparentPassEvent,
SceneRenderPhase.Transparent,
mainScene.transparentRendererListDesc,
mainScene.transparentDrawingSettings);
renderer.EnqueuePass(
m_drawTransparentObjectsPass);
}
private static bool ShouldUseSkyboxEnvironment(
RenderSceneSetupContext context,
Camera camera)
{
if (context == null ||
camera == null ||
!context.hasMainSceneDepthAttachment ||
(context.clearFlags & RenderClearFlags.Color) == 0 ||
!camera.skyboxEnabled)
{
return false;
}
return camera.projectionType ==
CameraProjectionType.Perspective;
}
}
}