Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3400913
Added basic camera stacking support (2D stacks with 2D, no post-proce…
rainsing Apr 8, 2020
88e64e9
Renderer2D now supports standalone depth texture, which is required b…
rainsing Apr 9, 2020
fec6ed7
Renderer2DLightingPass now handles standalone depth target properly.
rainsing Apr 9, 2020
edf6e5c
Bypass camera stacking compatiblity check for the 2D Renderer.
rainsing Apr 10, 2020
3987b6b
Generate post-processing LUT in the base camera only.
rainsing Apr 13, 2020
520ad0a
Camera that has post-processing but isn't the last one in stack now w…
rainsing Apr 13, 2020
9c9779f
Rewrote how we enqueue post-processing and final blit passes to prope…
rainsing Apr 14, 2020
b351cea
Added a camera stacking warning to Pixel Perfect Camera editor.
rainsing Apr 15, 2020
dcfdf04
Coden gardening for PR.
rainsing Apr 15, 2020
15e33c3
Reorgnized the code for better readability and testability.
rainsing Apr 16, 2020
7e1f7dc
Added a few tests for 2D Renderer that cover render textures creation.
rainsing Apr 17, 2020
407901c
Update CHANGELOG.md
rainsing Apr 17, 2020
6620c56
Merge branch 'master' into 2d/camera-stacking
rainsing Apr 17, 2020
69d476c
Merge branch 'master' into 2d/camera-stacking
rainsing Apr 22, 2020
aeeb58b
Merge branch 'master' into 2d/camera-stacking
rainsing Apr 23, 2020
4067802
Moved Renderer2DTests from URP package to the test project.
rainsing Apr 23, 2020
21558e3
Fixed mismatching MSAA sample count between color and depth targets w…
rainsing Apr 26, 2020
1bc56df
Merge branch 'master' into 2d/camera-stacking
phi-lira Apr 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
using NUnit.Framework;
using UnityEngine;
using UnityEngine.Experimental.Rendering.Universal;
using UnityEngine.Rendering.Universal;

[TestFixture]
class Renderer2DTests
{
GameObject m_BaseObj;
GameObject m_OverlayObj;
Camera m_BaseCamera;
Camera m_OverlayCamera;
UniversalAdditionalCameraData m_BaseCameraData;
UniversalAdditionalCameraData m_OverlayCameraData;

[SetUp]
public void Setup()
{
m_BaseObj = new GameObject();
m_BaseCamera = m_BaseObj.AddComponent<Camera>();
m_BaseCameraData = m_BaseObj.AddComponent<UniversalAdditionalCameraData>();

m_BaseCamera.allowHDR = false;
m_BaseCameraData.SetRenderer(3); // 2D Renderer. See the list of Renderers in CommonAssets/UniversalRPAsset.
m_BaseCameraData.renderType = CameraRenderType.Base;
m_BaseCameraData.renderPostProcessing = false;

m_OverlayObj = new GameObject();
m_OverlayCamera = m_OverlayObj.AddComponent<Camera>();
m_OverlayCameraData = m_OverlayObj.AddComponent<UniversalAdditionalCameraData>();

m_OverlayCamera.allowHDR = false;
m_OverlayCameraData.SetRenderer(3); // 2D Renderer. See the list of Renderers in CommonAssets/UniversalRPAsset.
m_OverlayCameraData.renderType = CameraRenderType.Overlay;
m_OverlayCameraData.renderPostProcessing = false;
}

[TearDown]
public void Cleanup()
{
Object.DestroyImmediate(m_OverlayObj);
Object.DestroyImmediate(m_BaseObj);
}

[Test]
public void BaseRendererDoesNotCreateRenderTexturesIfStackIsEmpty()
{
m_BaseCamera.Render();

Renderer2D baseRenderer = m_BaseCameraData.scriptableRenderer as Renderer2D;

Assert.IsFalse(baseRenderer.createColorTexture);
Assert.AreEqual(RenderTargetHandle.CameraTarget.Identifier(), baseRenderer.cameraColorTarget);

Assert.IsFalse(baseRenderer.createDepthTexture);
Assert.AreEqual(RenderTargetHandle.CameraTarget.Identifier(), baseRenderer.cameraDepth);
}

[Test]
public void BaseRendererCreatesRenderTexturesIfStackIsNotEmpty()
{
m_BaseCameraData.cameraStack.Add(m_OverlayCamera);

m_BaseCamera.Render();

Renderer2D baseRenderer = m_BaseCameraData.scriptableRenderer as Renderer2D;

Assert.IsTrue(baseRenderer.createColorTexture);
Assert.AreNotEqual(RenderTargetHandle.CameraTarget.Identifier(), baseRenderer.cameraColorTarget);

Assert.IsTrue(baseRenderer.createDepthTexture);
Assert.AreNotEqual(RenderTargetHandle.CameraTarget.Identifier(), baseRenderer.cameraDepth);
}

[Test]
public void BaseRendererUsesDepthAttachmentOfColorTextureIfNoDepthTextureCreated()
{
m_BaseCameraData.renderPostProcessing = true; // This will make the renderer create color texture.

m_BaseCamera.Render();

Renderer2D baseRenderer = m_BaseCameraData.scriptableRenderer as Renderer2D;

Assert.IsTrue(baseRenderer.createColorTexture);
Assert.AreNotEqual(RenderTargetHandle.CameraTarget.Identifier(), baseRenderer.cameraColorTarget);

Assert.IsFalse(baseRenderer.createDepthTexture);
Assert.AreEqual(baseRenderer.cameraColorTarget, baseRenderer.cameraDepth);
}

[Test]
public void OverlayRendererUsesRenderTexturesFromBase()
{
m_BaseCameraData.cameraStack.Add(m_OverlayCamera);

m_BaseCamera.Render();

Renderer2D baseRenderer = m_BaseCameraData.scriptableRenderer as Renderer2D;
Renderer2D overlayRenderer = m_OverlayCameraData.scriptableRenderer as Renderer2D;

Assert.AreEqual(baseRenderer.cameraColorTarget, overlayRenderer.cameraColorTarget);
Assert.AreEqual(baseRenderer.cameraDepth, overlayRenderer.cameraDepth);
}

[Test]
public void OverlayRendererSetsTheCreateTextureFlags()
{
m_BaseCameraData.cameraStack.Add(m_OverlayCamera);

m_BaseCamera.Render();

Renderer2D overlayRenderer = m_OverlayCameraData.scriptableRenderer as Renderer2D;

Assert.IsTrue(overlayRenderer.createColorTexture);
Assert.IsTrue(overlayRenderer.createDepthTexture);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions com.unity.render-pipelines.universal/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- DepthOnlyPass, CopyDepthPass and CopyColorPass now use OnCameraSetup() instead of Configure() to set up their passes before executing as they only need to get their rendertextures once per camera instead of once per eye.
- Updated shaders to be compatible with Microsoft's DXC.
- Mesh GPU Instancing option is now hidden from the particles system renderer as this feature is not supported by URP.
- The 2D Renderer now supports camera stacking.

### Fixed
- Fixed an issue where linear to sRGB conversion occurred twice on certain Android devices.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using UnityEngine;
using UnityEngine.Experimental.Rendering.Universal;
using UnityEngine.Rendering.Universal;

namespace UnityEditor.Experimental.Rendering.Universal
{
Expand All @@ -19,6 +20,7 @@ private class Style
public GUIContent stretchFill = new GUIContent("Stretch Fill", "If enabled, expands the viewport to fit the screen resolution while maintaining the viewport aspect ratio.");
public GUIContent currentPixelRatio = new GUIContent("Current Pixel Ratio", "Ratio of the rendered Sprites compared to their original size.");
public GUIContent runInEditMode = new GUIContent("Run In Edit Mode", "Enable this to preview Camera setting changes in Edit Mode. This will cause constant changes to the Scene while active.");
public const string cameraStackingWarning = "Pixel Perfect Camera won't function properly if stacked with another camera.";

public GUIStyle centeredLabel;

Expand All @@ -45,6 +47,7 @@ public Style()

private Vector2 m_GameViewSize = Vector2.zero;
private GUIContent m_CurrentPixelRatioValue;
bool m_CameraStacking;

private void LazyInit()
{
Expand All @@ -55,6 +58,26 @@ private void LazyInit()
m_CurrentPixelRatioValue = new GUIContent();
}

void CheckForCameraStacking()
{
m_CameraStacking = false;

PixelPerfectCamera obj = target as PixelPerfectCamera;
UniversalAdditionalCameraData cameraData = null;
obj?.TryGetComponent(out cameraData);

if (cameraData == null)
return;

if (cameraData.renderType == CameraRenderType.Base)
{
var cameraStack = cameraData.cameraStack;
m_CameraStacking = cameraStack != null ? cameraStack.Count > 0 : false;
}
else if (cameraData.renderType == CameraRenderType.Overlay)
m_CameraStacking = true;
}

public void OnEnable()
{
m_AssetsPPU = serializedObject.FindProperty("m_AssetsPPU");
Expand Down Expand Up @@ -92,6 +115,12 @@ public override void OnInspectorGUI()

serializedObject.Update();

if (Event.current.type == EventType.Layout)
CheckForCameraStacking();

if (m_CameraStacking)
EditorGUILayout.HelpBox(Style.cameraStackingWarning, MessageType.Warning);

EditorGUILayout.PropertyField(m_AssetsPPU, m_Style.assetsPPU);
if (m_AssetsPPU.intValue <= 0)
m_AssetsPPU.intValue = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData

// Start Rendering
if (lightStats.totalNormalMapUsage > 0)
RendererLighting.RenderNormals(context, renderingData.cullResults, normalsDrawSettings, filterSettings);
RendererLighting.RenderNormals(context, renderingData.cullResults, normalsDrawSettings, filterSettings, depthAttachment);

cmd.Clear();
if (lightStats.totalLights > 0)
Expand All @@ -147,7 +147,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
RendererLighting.ClearDirtyLighting(cmd, lightStats.blendStylesUsed);
}

CoreUtils.SetRenderTarget(cmd, colorAttachment, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, ClearFlag.None, Color.white);
CoreUtils.SetRenderTarget(cmd, colorAttachment, depthAttachment, ClearFlag.None, Color.white);
context.ExecuteCommandBuffer(cmd);

Profiler.BeginSample("RenderSpritesWithLighting - Draw Transparent Renderers");
Expand All @@ -158,7 +158,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
{

cmd.Clear();
RendererLighting.RenderLightVolumes(camera, cmd, layerToRender, colorAttachment, lightStats.blendStylesUsed);
RendererLighting.RenderLightVolumes(camera, cmd, layerToRender, colorAttachment, depthAttachment, lightStats.blendStylesUsed);
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
}
Expand All @@ -180,7 +180,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
CommandBuffer cmd = CommandBufferPool.Get("Render Unlit");
DrawingSettings unlitDrawSettings = CreateDrawingSettings(k_ShaderTags, ref renderingData, SortingCriteria.CommonTransparent);

CoreUtils.SetRenderTarget(cmd, colorAttachment, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, ClearFlag.None, Color.white);
CoreUtils.SetRenderTarget(cmd, colorAttachment, depthAttachment, ClearFlag.None, Color.white);
cmd.SetGlobalTexture("_ShapeLightTexture0", Texture2D.blackTexture);
cmd.SetGlobalTexture("_ShapeLightTexture1", Texture2D.blackTexture);
cmd.SetGlobalTexture("_ShapeLightTexture2", Texture2D.blackTexture);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ static public void CreateNormalMapRenderTexture(CommandBuffer cmd)
descriptor.useMipMap = false;
descriptor.autoGenerateMips = false;
descriptor.depthBufferBits = 0;
descriptor.msaaSamples = 1;
descriptor.msaaSamples = s_RenderingData.cameraData.cameraTargetDescriptor.msaaSamples;
descriptor.dimension = TextureDimension.Tex2D;

cmd.GetTemporaryRT(s_NormalsTarget.id, descriptor, FilterMode.Bilinear);
Expand Down Expand Up @@ -184,7 +184,7 @@ static public void ReleaseRenderTextures(CommandBuffer cmd)
}


static private void RenderShadows(CommandBuffer cmdBuffer, int layerToRender, Light2D light, float shadowIntensity, RenderTargetIdentifier renderTexture)
static private void RenderShadows(CommandBuffer cmdBuffer, int layerToRender, Light2D light, float shadowIntensity, RenderTargetIdentifier renderTexture, RenderTargetIdentifier depthTexture)
{
cmdBuffer.SetGlobalFloat("_ShadowIntensity", 1 - light.shadowIntensity);
cmdBuffer.SetGlobalFloat("_ShadowVolumeIntensity", 1 - light.shadowVolumeIntensity);
Expand Down Expand Up @@ -268,7 +268,7 @@ static private void RenderShadows(CommandBuffer cmdBuffer, int layerToRender, Li
}

ReleaseShadowRenderTexture(cmdBuffer);
cmdBuffer.SetRenderTarget(renderTexture);
cmdBuffer.SetRenderTarget(renderTexture, depthTexture);
}
}

Expand All @@ -287,7 +287,7 @@ static private bool RenderLightSet(Camera camera, int blendStyleIndex, CommandBu
Mesh lightMesh = light.GetMesh();
if (lightMesh != null)
{
RenderShadows(cmdBuffer, layerToRender, light, light.shadowIntensity, renderTexture);
RenderShadows(cmdBuffer, layerToRender, light, light.shadowIntensity, renderTexture, renderTexture);

renderedAnyLight = true;

Expand Down Expand Up @@ -322,7 +322,7 @@ static private bool RenderLightSet(Camera camera, int blendStyleIndex, CommandBu
return renderedAnyLight;
}

static private void RenderLightVolumeSet(Camera camera, int blendStyleIndex, CommandBuffer cmdBuffer, int layerToRender, RenderTargetIdentifier renderTexture, List<Light2D> lights)
static private void RenderLightVolumeSet(Camera camera, int blendStyleIndex, CommandBuffer cmdBuffer, int layerToRender, RenderTargetIdentifier renderTexture, RenderTargetIdentifier depthTexture, List<Light2D> lights)
{
if (lights.Count > 0)
{
Expand All @@ -341,7 +341,7 @@ static private void RenderLightVolumeSet(Camera camera, int blendStyleIndex, Com
Mesh lightMesh = light.GetMesh();
if (lightMesh != null)
{
RenderShadows(cmdBuffer, layerToRender, light, light.shadowVolumeIntensity, renderTexture);
RenderShadows(cmdBuffer, layerToRender, light, light.shadowVolumeIntensity, renderTexture, depthTexture);

if (light.lightType == Light2D.LightType.Sprite && light.lightCookieSprite != null && light.lightCookieSprite.texture != null)
cmdBuffer.SetGlobalTexture("_CookieTex", light.lightCookieSprite.texture);
Expand Down Expand Up @@ -480,10 +480,10 @@ static public void ClearDirtyLighting(CommandBuffer cmdBuffer, uint blendStylesU
}
}

static public void RenderNormals(ScriptableRenderContext renderContext, CullingResults cullResults, DrawingSettings drawSettings, FilteringSettings filterSettings)
static public void RenderNormals(ScriptableRenderContext renderContext, CullingResults cullResults, DrawingSettings drawSettings, FilteringSettings filterSettings, RenderTargetIdentifier depthTarget)
{
var cmd = CommandBufferPool.Get("Clear Normals");
cmd.SetRenderTarget(s_NormalsTarget.Identifier());
cmd.SetRenderTarget(s_NormalsTarget.Identifier(), depthTarget);
cmd.ClearRenderTarget(true, true, k_NormalClearColor);
renderContext.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
Expand Down Expand Up @@ -529,7 +529,7 @@ static public void RenderLights(Camera camera, CommandBuffer cmdBuffer, int laye
}
}

static public void RenderLightVolumes(Camera camera, CommandBuffer cmdBuffer, int layerToRender, RenderTargetIdentifier renderTarget, uint blendStylesUsed)
static public void RenderLightVolumes(Camera camera, CommandBuffer cmdBuffer, int layerToRender, RenderTargetIdentifier renderTarget, RenderTargetIdentifier depthTarget, uint blendStylesUsed)
{
for (int i = 0; i < s_BlendStyles.Length; ++i)
{
Expand All @@ -545,6 +545,7 @@ static public void RenderLightVolumes(Camera camera, CommandBuffer cmdBuffer, in
cmdBuffer,
layerToRender,
renderTarget,
depthTarget,
Light2D.GetLightsByBlendStyle(i)
);

Expand Down
Loading