Skip to content

Commit b10c697

Browse files
authored
[8.x.x Backport] isSceneCamera changed to property, isPreviewCamera and cameraType added plus two bugfixes for 1240723 & 1204376 (#263)
* Backport of #256 * isPreviewViewCamera to isPreviewCamera renaming * Making isSceneCamera obsolete and adding cameraType. Also fixing bug 1204376 * Changing the obsolete message from being an error to a warning * Making the isSceneCamera and isPreviewCamera properties, reverted some changes and updated the changelog * Updated the warning message for setting isSceneViewCamera.
1 parent 2d4c4f3 commit b10c697

8 files changed

Lines changed: 66 additions & 30 deletions

File tree

com.unity.render-pipelines.universal/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## [Unreleased]
88

9+
### Changed
10+
- Setting the renderingData.cameraData.isSceneCamera is now marked as obsolete and replaced by renderingData.cameraData.cameraType.
11+
912
### Fixed
13+
- Fixed an issue where grid lines were being drawn on top of opaque objects in the preview window [case 1240723](https://issuetracker.unity3d.com/issues/urp-grid-is-rendered-in-front-of-the-model-in-the-inspector-animation-preview-window-when-depth-or-opaque-texture-is-enabled)
14+
- Fixed an issue where objects in the preview window were being affected by layer mask settings in the default renderer [case 1204376](https://issuetracker.unity3d.com/issues/urp-prefab-preview-is-blank-when-a-custom-forward-renderer-data-and-default-layer-mask-is-mixed-are-used)
1015
- Fixed issues with performance when importing fbx files
1116
- Fixed issues with NullReferenceException happening with URP shaders
1217
- Fixed an issue where the emission value in particle shaders would not update in the editor without entering playmode.

com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re
150150
EnqueuePass(m_FinalBlitPass);
151151
}
152152
}
153-
153+
154154
public override void SetupCullingParameters(ref ScriptableCullingParameters cullingParameters, ref CameraData cameraData)
155155
{
156156
cullingParameters.cullingOptions = CullingOptions.None;

com.unity.render-pipelines.universal/Runtime/ForwardRenderer.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re
147147
// We generate color LUT in the base camera only. This allows us to not break render pass execution for overlay cameras.
148148
bool generateColorGradingLUT = anyPostProcessing && cameraData.renderType == CameraRenderType.Base;
149149
bool isSceneViewCamera = cameraData.isSceneViewCamera;
150+
bool isPreviewCamera = cameraData.isPreviewCamera;
150151
bool requiresDepthTexture = cameraData.requiresDepthTexture;
151152
bool isStereoEnabled = cameraData.isStereoEnabled;
152153

@@ -155,10 +156,11 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re
155156
bool transparentsNeedSettingsPass = m_TransparentSettingsPass.Setup(ref renderingData);
156157

157158
// Depth prepass is generated in the following cases:
158-
// - Scene view camera always requires a depth texture. We do a depth pre-pass to simplify it and it shouldn't matter much for editor.
159159
// - If game or offscreen camera requires it we check if we can copy the depth from the rendering opaques pass and use that instead.
160-
bool requiresDepthPrepass = isSceneViewCamera;
161-
requiresDepthPrepass |= (requiresDepthTexture && !CanCopyDepth(ref renderingData.cameraData));
160+
// - Scene or preview cameras always require a depth texture. We do a depth pre-pass to simplify it and it shouldn't matter much for editor.
161+
bool requiresDepthPrepass = requiresDepthTexture && !CanCopyDepth(ref renderingData.cameraData);
162+
requiresDepthPrepass |= isSceneViewCamera;
163+
requiresDepthPrepass |= isPreviewCamera;
162164

163165
// The copying of depth should normally happen after rendering opaques.
164166
// But if we only require it for post processing or the scene camera then we do it after rendering transparent objects
@@ -170,6 +172,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re
170172
requiresDepthPrepass = true;
171173

172174
bool createColorTexture = RequiresIntermediateColorTexture(ref cameraData);
175+
createColorTexture &= !isPreviewCamera;
173176

174177
// If camera requires depth and there's no depth pre-pass we create a depth texture that can be read later by effect requiring it.
175178
bool createDepthTexture = cameraData.requiresDepthTexture && !requiresDepthPrepass;
@@ -328,7 +331,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re
328331
}
329332

330333
#if UNITY_EDITOR
331-
if (renderingData.cameraData.isSceneViewCamera)
334+
if (isSceneViewCamera)
332335
{
333336
// Scene view camera should always resolve target (not stacked)
334337
Assertions.Assert.IsTrue(lastCameraInTheStack, "Editor camera must resolve target upon finish rendering.");
@@ -446,13 +449,14 @@ bool RequiresIntermediateColorTexture(ref CameraData cameraData)
446449
if (cameraData.renderType == CameraRenderType.Base && !cameraData.resolveFinalTarget)
447450
return true;
448451

452+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
449453
var cameraTargetDescriptor = cameraData.cameraTargetDescriptor;
450454
int msaaSamples = cameraTargetDescriptor.msaaSamples;
451455
bool isStereoEnabled = cameraData.isStereoEnabled;
452456
bool isScaledRender = !Mathf.Approximately(cameraData.renderScale, 1.0f) && !cameraData.isStereoEnabled;
453457
bool isCompatibleBackbufferTextureDimension = cameraTargetDescriptor.dimension == TextureDimension.Tex2D;
454458
bool requiresExplicitMsaaResolve = msaaSamples > 1 && !SystemInfo.supportsMultisampleAutoResolve;
455-
bool isOffscreenRender = cameraData.targetTexture != null && !cameraData.isSceneViewCamera;
459+
bool isOffscreenRender = cameraData.targetTexture != null && !isSceneViewCamera;
456460
bool isCapturing = cameraData.captureActions != null;
457461

458462
#if ENABLE_VR && ENABLE_VR_MODULE
@@ -464,7 +468,7 @@ bool RequiresIntermediateColorTexture(ref CameraData cameraData)
464468
if (isOffscreenRender)
465469
return requiresBlitForOffscreenCamera;
466470

467-
return requiresBlitForOffscreenCamera || cameraData.isSceneViewCamera || isScaledRender || cameraData.isHdrEnabled ||
471+
return requiresBlitForOffscreenCamera || isSceneViewCamera || isScaledRender || cameraData.isHdrEnabled ||
468472
!isCompatibleBackbufferTextureDimension || !cameraData.isDefaultViewport || isCapturing ||
469473
(Display.main.requiresBlitToBackbuffer && !isStereoEnabled);
470474
}

com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public DrawObjectsPass(string profilerTag, bool opaque, RenderPassEvent evt, Ren
2727
m_ShaderTagIdList.Add(new ShaderTagId("UniversalForward"));
2828
m_ShaderTagIdList.Add(new ShaderTagId("LightweightForward"));
2929
renderPassEvent = evt;
30+
3031
m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
3132
m_RenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
3233
m_IsOpaque = opaque;
@@ -56,10 +57,20 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
5657
Camera camera = renderingData.cameraData.camera;
5758
var sortFlags = (m_IsOpaque) ? renderingData.cameraData.defaultOpaqueSortFlags : SortingCriteria.CommonTransparent;
5859
var drawSettings = CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortFlags);
59-
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref m_FilteringSettings, ref m_RenderStateBlock);
60+
var filterSettings = m_FilteringSettings;
61+
62+
#if UNITY_EDITOR
63+
// When rendering the preview camera, we want the layer mask to be forced to Everything
64+
if (renderingData.cameraData.isPreviewCamera)
65+
{
66+
filterSettings.layerMask = -1;
67+
}
68+
#endif
69+
70+
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);
6071

6172
// Render objects that did not match any shader pass with error shader
62-
RenderingUtils.RenderObjectsWithError(context, ref renderingData.cullResults, camera, m_FilteringSettings, SortingCriteria.None);
73+
RenderingUtils.RenderObjectsWithError(context, ref renderingData.cullResults, camera, filterSettings, SortingCriteria.None);
6374
}
6475
context.ExecuteCommandBuffer(cmd);
6576
CommandBufferPool.Release(cmd);

com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
4646
RenderTargetIdentifier cameraTarget = (cameraData.targetTexture != null) ? new RenderTargetIdentifier(cameraData.targetTexture) : BuiltinRenderTextureType.CameraTarget;
4747

4848
bool requiresSRGBConvertion = Display.main.requiresSrgbBlitToBackbuffer;
49+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
4950

5051
// For stereo case, eye texture always want color data in sRGB space.
5152
// If eye texture color format is linear, we do explicit sRGB convertion
@@ -64,7 +65,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
6465
// The blit will be reworked for stereo along the XRSDK work.
6566
Material blitMaterial = (cameraData.isStereoEnabled) ? null : m_BlitMaterial;
6667
cmd.SetGlobalTexture("_BlitTex", m_Source.Identifier());
67-
if (cameraData.isStereoEnabled || cameraData.isSceneViewCamera || cameraData.isDefaultViewport)
68+
if (cameraData.isStereoEnabled || isSceneViewCamera || cameraData.isDefaultViewport)
6869
{
6970
// This set render target is necessary so we change the LOAD state to DontCare.
7071
cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget,

com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ void Render(CommandBuffer cmd, ref RenderingData renderingData)
240240
bool tempTarget2Used = false;
241241
int source = m_Source.id;
242242
int destination = -1;
243+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
243244

244245
// Utilities to simplify intermediate target management
245246
int GetSource() => source;
@@ -257,7 +258,7 @@ int GetDestination()
257258
// Avoid using m_Source.id as new destination, it may come with a depth buffer that we don't want, may have MSAA that we don't want etc
258259
cmd.GetTemporaryRT(ShaderConstants._TempTarget2, GetStereoCompatibleDescriptor(), FilterMode.Bilinear);
259260
destination = ShaderConstants._TempTarget2;
260-
tempTarget2Used = true;
261+
tempTarget2Used = true;
261262
}
262263

263264
return destination;
@@ -291,7 +292,7 @@ int GetDestination()
291292
}
292293

293294
// Depth of Field
294-
if (m_DepthOfField.IsActive() && !cameraData.isSceneViewCamera)
295+
if (m_DepthOfField.IsActive() && !isSceneViewCamera)
295296
{
296297
var markerName = m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian
297298
? URPProfileId.GaussianDepthOfField
@@ -305,7 +306,7 @@ int GetDestination()
305306
}
306307

307308
// Motion blur
308-
if (m_MotionBlur.IsActive() && !cameraData.isSceneViewCamera)
309+
if (m_MotionBlur.IsActive() && !isSceneViewCamera)
309310
{
310311
using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.MotionBlur)))
311312
{
@@ -316,7 +317,7 @@ int GetDestination()
316317

317318
// Panini projection is done as a fullscreen pass after all depth-based effects are done
318319
// and before bloom kicks in
319-
if (m_PaniniProjection.IsActive() && !cameraData.isSceneViewCamera)
320+
if (m_PaniniProjection.IsActive() && !isSceneViewCamera)
320321
{
321322
using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.PaniniProjection)))
322323
{
@@ -340,7 +341,7 @@ int GetDestination()
340341
}
341342

342343
// Setup other effects constants
343-
SetupLensDistortion(m_Materials.uber, cameraData.isSceneViewCamera);
344+
SetupLensDistortion(m_Materials.uber, isSceneViewCamera);
344345
SetupChromaticAberration(m_Materials.uber);
345346
SetupVignette(m_Materials.uber);
346347
SetupColorGrading(cmd, ref renderingData, m_Materials.uber);

com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ static void RenderSingleCamera(ScriptableRenderContext context, CameraData camer
207207
return;
208208

209209
ScriptableRenderer.current = renderer;
210+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
210211

211212
ProfilingSampler sampler = (asset.debugLevel >= PipelineDebugLevel.Profiling) ? new ProfilingSampler(camera.name): _CameraProfilingSampler;
212213
CommandBuffer cmd = CommandBufferPool.Get(sampler.name);
@@ -220,7 +221,7 @@ static void RenderSingleCamera(ScriptableRenderContext context, CameraData camer
220221

221222
#if UNITY_EDITOR
222223
// Emit scene view UI
223-
if (cameraData.isSceneViewCamera)
224+
if (isSceneViewCamera)
224225
{
225226
ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);
226227
}
@@ -432,13 +433,14 @@ static void InitializeStackedCameraData(Camera baseCamera, UniversalAdditionalCa
432433
var settings = asset;
433434
cameraData.targetTexture = baseCamera.targetTexture;
434435
cameraData.isStereoEnabled = IsStereoEnabled(baseCamera);
435-
cameraData.isSceneViewCamera = baseCamera.cameraType == CameraType.SceneView;
436-
436+
cameraData.cameraType = baseCamera.cameraType;
437437
cameraData.numberOfXRPasses = 1;
438438
cameraData.isXRMultipass = false;
439439

440+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
441+
440442
#if ENABLE_VR && ENABLE_VR_MODULE
441-
if (cameraData.isStereoEnabled && !cameraData.isSceneViewCamera && XR.XRSettings.stereoRenderingMode == XR.XRSettings.StereoRenderingMode.MultiPass)
443+
if (cameraData.isStereoEnabled && !isSceneViewCamera && XR.XRSettings.stereoRenderingMode == XR.XRSettings.StereoRenderingMode.MultiPass)
442444
{
443445
cameraData.numberOfXRPasses = 2;
444446
cameraData.isXRMultipass = true;
@@ -448,7 +450,7 @@ static void InitializeStackedCameraData(Camera baseCamera, UniversalAdditionalCa
448450
///////////////////////////////////////////////////////////////////
449451
// Environment and Post-processing settings /
450452
///////////////////////////////////////////////////////////////////
451-
if (cameraData.isSceneViewCamera)
453+
if (isSceneViewCamera)
452454
{
453455
cameraData.volumeLayerMask = 1; // "Default"
454456
cameraData.volumeTrigger = null;
@@ -525,10 +527,10 @@ static void InitializeAdditionalCameraData(Camera camera, UniversalAdditionalCam
525527

526528
bool anyShadowsEnabled = settings.supportsMainLightShadows || settings.supportsAdditionalLightShadows;
527529
cameraData.maxShadowDistance = Mathf.Min(settings.shadowDistance, camera.farClipPlane);
528-
cameraData.maxShadowDistance = (anyShadowsEnabled && cameraData.maxShadowDistance >= camera.nearClipPlane) ?
529-
cameraData.maxShadowDistance : 0.0f;
530+
cameraData.maxShadowDistance = (anyShadowsEnabled && cameraData.maxShadowDistance >= camera.nearClipPlane) ? cameraData.maxShadowDistance : 0.0f;
530531

531-
if (cameraData.isSceneViewCamera)
532+
bool isSceneViewCamera = cameraData.isSceneViewCamera;
533+
if (isSceneViewCamera)
532534
{
533535
cameraData.renderType = CameraRenderType.Base;
534536
cameraData.clearDepth = true;
@@ -569,7 +571,7 @@ static void InitializeAdditionalCameraData(Camera camera, UniversalAdditionalCam
569571
// Disables post if GLes2
570572
cameraData.postProcessEnabled &= SystemInfo.graphicsDeviceType != GraphicsDeviceType.OpenGLES2;
571573

572-
cameraData.requiresDepthTexture |= cameraData.isSceneViewCamera || CheckPostProcessForDepth(cameraData);
574+
cameraData.requiresDepthTexture |= isSceneViewCamera || CheckPostProcessForDepth(cameraData);
573575
cameraData.resolveFinalTarget = resolveFinalTarget;
574576

575577
Matrix4x4 projectionMatrix = camera.projectionMatrix;
@@ -631,8 +633,6 @@ static void InitializeRenderingData(UniversalRenderPipelineAsset settings, ref C
631633
InitializePostProcessingData(settings, out renderingData.postProcessingData);
632634
renderingData.supportsDynamicBatching = settings.supportsDynamicBatching;
633635
renderingData.perObjectData = GetPerObjectLightFlags(renderingData.lightData.additionalLightsCount);
634-
635-
bool isOffscreenCamera = cameraData.targetTexture != null && !cameraData.isSceneViewCamera;
636636
renderingData.postProcessingEnabled = anyPostProcessingEnabled;
637637
}
638638

com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public Matrix4x4 GetProjectionMatrix()
7474

7575
/// <summary>
7676
/// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z.
77-
/// Similar to <c>GL.GetGPUProjectionMatrix</c> but queries URP internal state to know if the pipeline is rendering to render texture.
77+
/// Similar to <c>GL.GetGPUProjectionMatrix</c> but queries URP internal state to know if the pipeline is rendering to render texture.
7878
/// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html
7979
/// </summary>
8080
/// <seealso cref="GL.GetGPUProjectionMatrix(Matrix4x4, bool)"/>
@@ -94,12 +94,26 @@ public Matrix4x4 GetGPUProjectionMatrix()
9494
internal float aspectRatio;
9595
public float renderScale;
9696
public bool clearDepth;
97-
public bool isSceneViewCamera;
97+
public CameraType cameraType;
9898
public bool isDefaultViewport;
9999
public bool isHdrEnabled;
100100
public bool requiresDepthTexture;
101101
public bool requiresOpaqueTexture;
102102

103+
/// <summary>
104+
/// True if the camera rendering is for the scene window in the editor
105+
/// </summary>
106+
public bool isSceneViewCamera
107+
{
108+
get => cameraType == CameraType.SceneView;
109+
set { Debug.LogWarning("Setting isSceneViewCamera is an invalid operation. Please use cameraType instead."); }
110+
}
111+
112+
/// <summary>
113+
/// True if the camera rendering is for the preview window in the editor
114+
/// </summary>
115+
public bool isPreviewCamera => cameraType == CameraType.Preview;
116+
103117
/// <summary>
104118
/// True if the camera device projection matrix is flipped. This happens when the pipeline is rendering
105119
/// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures
@@ -178,7 +192,7 @@ public static class ShaderPropertyId
178192
public static readonly int viewAndProjectionMatrix = Shader.PropertyToID("unity_MatrixVP");
179193

180194
public static readonly int inverseViewMatrix = Shader.PropertyToID("unity_MatrixInvV");
181-
// Undefined:
195+
// Undefined:
182196
// public static readonly int inverseProjectionMatrix = Shader.PropertyToID("unity_MatrixInvP");
183197
public static readonly int inverseViewAndProjectionMatrix = Shader.PropertyToID("unity_MatrixInvVP");
184198

@@ -346,7 +360,7 @@ static RenderTextureDescriptor CreateRenderTextureDescriptor(Camera camera, floa
346360
{
347361
bool use32BitHDR = !needsAlpha && RenderingUtils.SupportsRenderTextureFormat(RenderTextureFormat.RGB111110Float);
348362
RenderTextureFormat hdrFormat = (use32BitHDR) ? RenderTextureFormat.RGB111110Float : RenderTextureFormat.DefaultHDR;
349-
363+
350364
desc.colorFormat = isHdrEnabled ? hdrFormat : renderTextureFormatDefault;
351365
desc.depthBufferBits = 32;
352366
desc.msaaSamples = msaaSamples;

0 commit comments

Comments
 (0)