[Unity]URP-UniversalRenderPipelineCore.cs
2020/09
14
20:09
using System;
using System.Collections.Generic;
using Unity.Collections;
using UnityEngine.Scripting.APIUpdating;
using UnityEngine.Experimental.GlobalIllumination;
using Lightmapping = UnityEngine.Experimental.GlobalIllumination.Lightmapping;
namespace UnityEngine.Rendering.Universal
{
public enum MixedLightingSetup
{
None,
ShadowMask,
Subtractive,
};
public struct RenderingData
{
public CullingResults cullResults;
public CameraData cameraData;
public LightData lightData;
public ShadowData shadowData;
public PostProcessingData postProcessingData;
public bool supportsDynamicBatching;
public PerObjectData perObjectData;
[Obsolete("killAlphaInFinalBlit is deprecated in the Universal Render Pipeline since it is no longer needed on any supported platform.")]
public bool killAlphaInFinalBlit;
/// <summary>
/// True if post-processing effect is enabled while rendering the camera stack.
/// </summary>
public bool postProcessingEnabled;
internal bool resolveFinalTarget;
}
public struct LightData
{
public int mainLightIndex;
public int additionalLightsCount;
public int maxPerObjectAdditionalLightsCount;
public NativeArray<VisibleLight> visibleLights;
public bool shadeAdditionalLightsPerVertex;
public bool supportsMixedLighting;
}
public struct CameraData
{
public Camera camera;
public CameraRenderType renderType;
public RenderTexture targetTexture;
public RenderTextureDescriptor cameraTargetDescriptor;
// Internal camera data as we are not yet sure how to expose View in stereo context.
// We might change this API soon.
internal Matrix4x4 viewMatrix;
internal Matrix4x4 projectionMatrix;
internal Rect pixelRect;
internal int pixelWidth;
internal int pixelHeight;
internal float aspectRatio;
public float renderScale;
public bool clearDepth;
public bool isSceneViewCamera;
public bool isDefaultViewport;
public bool isHdrEnabled;
public bool requiresDepthTexture;
public bool requiresOpaqueTexture;
public SortingCriteria defaultOpaqueSortFlags;
public bool isStereoEnabled;
internal int numberOfXRPasses;
internal bool isXRMultipass;
public float maxShadowDistance;
public bool postProcessEnabled;
public IEnumerator<Action<RenderTargetIdentifier, CommandBuffer>> captureActions;
public LayerMask volumeLayerMask;
public Transform volumeTrigger;
public bool isStopNaNEnabled;
public bool isDitheringEnabled;
public AntialiasingMode antialiasing;
public AntialiasingQuality antialiasingQuality;
internal ScriptableRenderer renderer;
}
public struct ShadowData
{
public bool supportsMainLightShadows;
public bool requiresScreenSpaceShadowResolve;
public int mainLightShadowmapWidth;
public int mainLightShadowmapHeight;
public int mainLightShadowCascadesCount;
public Vector3 mainLightShadowCascadesSplit;
public bool supportsAdditionalLightShadows;
public int additionalLightsShadowmapWidth;
public int additionalLightsShadowmapHeight;
public bool supportsSoftShadows;
public int shadowmapDepthBufferBits;
public List<Vector4> bias;
}
public struct PostProcessingData
{
public ColorGradingMode gradingMode;
public int lutSize;
}
class CameraDataComparer : IComparer<Camera>
{
public int Compare(Camera lhs, Camera rhs)
{
return (int)lhs.depth - (int)rhs.depth;
}
}
public sealed partial class UniversalRenderPipeline
{
static List<Vector4> m_ShadowBiasData = new List<Vector4>();
/// <summary>
/// Checks if a camera is a game camera.
/// </summary>
/// <param name="camera">Camera to check state from.</param>
/// <returns>true if given camera is a game camera, false otherwise.</returns>
public static bool IsGameCamera(Camera camera)
{
if (camera == null)
throw new ArgumentNullException("camera");
return camera.cameraType == CameraType.Game || camera.cameraType == CameraType.VR;
}
/// <summary>
/// Checks if a camera is rendering in stereo mode.
/// </summary>
/// <param name="camera">Camera to check state from.</param>
/// <returns>Returns true if the given camera is rendering in stereo mode, false otherwise.</returns>
public static bool IsStereoEnabled(Camera camera)
{
if (camera == null)
throw new ArgumentNullException("camera");
bool isGameCamera = IsGameCamera(camera);
bool isCompatWithXRDimension = true;
return XRGraphics.enabled && isGameCamera && (camera.stereoTargetEye == StereoTargetEyeMask.Both) && isCompatWithXRDimension;
}
/// <summary>
/// Returns the current render pipeline asset for the current quality setting.
/// If no render pipeline asset is assigned in QualitySettings, then returns the one assigned in GraphicsSettings.
/// </summary>
public static UniversalRenderPipelineAsset asset
{
get => GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;
}
/// <summary>
/// Checks if a camera is rendering in MultiPass stereo mode.
/// </summary>
/// <param name="camera">Camera to check state from.</param>
/// <returns>Returns true if the given camera is rendering in multi pass stereo mode, false otherwise.</returns>
static bool IsMultiPassStereoEnabled(Camera camera)
{
if (camera == null)
throw new ArgumentNullException("camera");
return false;
}
void SortCameras(Camera[] cameras)
{
if (cameras.Length <= 1)
return;
Array.Sort(cameras, new CameraDataComparer());
}
static RenderTextureDescriptor CreateRenderTextureDescriptor(Camera camera, float renderScale,
bool isStereoEnabled, bool isHdrEnabled, int msaaSamples, bool needsAlpha)
{
RenderTextureDescriptor desc;
RenderTextureFormat renderTextureFormatDefault = RenderTextureFormat.Default;
// NB: There's a weird case about XR and render texture
// In test framework currently we render stereo tests to target texture
// The descriptor in that case needs to be initialized from XR eyeTexture not render texture
// Otherwise current tests will fail. Check: Do we need to update the test images instead?
if (isStereoEnabled)
{
desc = XRGraphics.eyeTextureDesc;
renderTextureFormatDefault = desc.colorFormat;
}
else if (camera.targetTexture == null)
{
desc = new RenderTextureDescriptor(camera.pixelWidth, camera.pixelHeight);
desc.width = (int)((float)desc.width * renderScale);
desc.height = (int)((float)desc.height * renderScale);
}
else
{
desc = camera.targetTexture.descriptor;
}
if (camera.targetTexture != null)
{
desc.colorFormat = camera.targetTexture.descriptor.colorFormat;
desc.depthBufferBits = camera.targetTexture.descriptor.depthBufferBits;
desc.msaaSamples = camera.targetTexture.descriptor.msaaSamples;
desc.sRGB = camera.targetTexture.descriptor.sRGB;
}
else
{
bool use32BitHDR = !needsAlpha && RenderingUtils.SupportsRenderTextureFormat(RenderTextureFormat.RGB111110Float);
RenderTextureFormat hdrFormat = (use32BitHDR) ? RenderTextureFormat.RGB111110Float : RenderTextureFormat.DefaultHDR;
desc.colorFormat = isHdrEnabled ? hdrFormat : renderTextureFormatDefault;
desc.depthBufferBits = 32;
desc.msaaSamples = msaaSamples;
desc.sRGB = (QualitySettings.activeColorSpace == ColorSpace.Linear);
}
desc.enableRandomWrite = false;
desc.bindMS = false;
desc.useDynamicScale = camera.allowDynamicResolution;
return desc;
}
static Lightmapping.RequestLightsDelegate lightsDelegate = (Light[] requests, NativeArray<LightDataGI> lightsOutput) =>
{
// Editor only.
LightDataGI lightData = new LightDataGI();
for (int i = 0; i < requests.Length; i++)
{
Light light = requests[i];
lightData.InitNoBake(light.GetInstanceID());
lightsOutput[i] = lightData;
}
Debug.LogWarning("Realtime GI is not supported in Universal Pipeline.");
};
}
}
protected override void UniversalRenderPipeline::Render(ScriptableRenderContext renderContext, Camera[] cameras)
{
BeginFrameRendering(renderContext, cameras);
GraphicsSettings.lightsUseLinearIntensity = (QualitySettings.activeColorSpace == ColorSpace.Linear);
GraphicsSettings.useScriptableRenderPipelineBatching = asset.useSRPBatcher;
SetupPerFrameShaderConstants();
SortCameras(cameras);
for (int i = 0; i < cameras.Length; ++i)
{
var camera = cameras[i];
if (IsGameCamera(camera))
{
RenderCameraStack(renderContext, camera);
}
else
{
BeginCameraRendering(renderContext, camera);
UpdateVolumeFramework(camera, null);
RenderSingleCamera(renderContext, camera);
EndCameraRendering(renderContext, camera);
}
}
EndFrameRendering(renderContext, cameras);
}
CopyRights: The Post by BY-NC-SA For Authorization,Original If Not Noted,Reprint Please Indicate From 老刘@开发笔记
Post Link: [Unity]URP-UniversalRenderPipelineCore.cs
Post Link: [Unity]URP-UniversalRenderPipelineCore.cs