Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

782 行
26 KiB

using System;
using UnityEngine.Scripting.APIUpdating;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using System.IO;
#endif
namespace UnityEngine.Rendering.LWRP
{
[Obsolete("LWRP -> Universal (UnityUpgradable) -> UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset", true)]
public class LightweightRenderPipelineAsset
{
}
}
namespace UnityEngine.Rendering.Universal
{
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowCascadesOption
{
NoCascades,
TwoCascades,
FourCascades,
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowQuality
{
Disabled,
HardShadows,
SoftShadows,
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShadowResolution
{
_256 = 256,
_512 = 512,
_1024 = 1024,
_2048 = 2048,
_4096 = 4096
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum MsaaQuality
{
Disabled = 1,
_2x = 2,
_4x = 4,
_8x = 8
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum Downsampling
{
None,
_2xBilinear,
_4xBox,
_4xBilinear
}
internal enum DefaultMaterialType
{
Standard,
Particle,
Terrain,
Sprite,
UnityBuiltinDefault
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum LightRenderingMode
{
Disabled = 0,
PerVertex = 2,
PerPixel = 1,
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum ShaderVariantLogLevel
{
Disabled,
OnlyUniversalRPShaders,
AllShaders,
}
[MovedFrom("UnityEngine.Rendering.LWRP")] public enum RendererType
{
Custom,
ForwardRenderer,
_2DRenderer,
}
public enum ColorGradingMode
{
LowDynamicRange,
HighDynamicRange
}
public class UniversalRenderPipelineAsset : RenderPipelineAsset, ISerializationCallbackReceiver
{
Shader m_DefaultShader;
// Default values set when a new UniversalRenderPipeline asset is created
[SerializeField] int k_AssetVersion = 5;
bool m_NeedsUpgrade;
// Deprecated settings for upgrading sakes
[SerializeField] RendererType m_RendererType = RendererType.ForwardRenderer;
[SerializeField] internal ScriptableRendererData m_RendererData = null;
// Renderer settings
[SerializeField] internal ScriptableRendererData[] m_RendererDataList = new ScriptableRendererData[1];
internal ScriptableRenderer[] m_Renderers;
[SerializeField] int m_DefaultRenderer = 0;
// General settings
[SerializeField] bool m_RequireDepthTexture = false;
[SerializeField] bool m_RequireOpaqueTexture = false;
[SerializeField] Downsampling m_OpaqueDownsampling = Downsampling._2xBilinear;
// Quality settings
[SerializeField] bool m_SupportsHDR = false;
[SerializeField] MsaaQuality m_MSAA = MsaaQuality.Disabled;
[SerializeField] float m_RenderScale = 1.0f;
// TODO: Shader Quality Tiers
// Main directional light Settings
[SerializeField] LightRenderingMode m_MainLightRenderingMode = LightRenderingMode.PerPixel;
[SerializeField] bool m_MainLightShadowsSupported = true;
[SerializeField] ShadowResolution m_MainLightShadowmapResolution = ShadowResolution._2048;
// Additional lights settings
[SerializeField] LightRenderingMode m_AdditionalLightsRenderingMode = LightRenderingMode.PerPixel;
[SerializeField] int m_AdditionalLightsPerObjectLimit = 4;
[SerializeField] bool m_AdditionalLightShadowsSupported = false;
[SerializeField] ShadowResolution m_AdditionalLightsShadowmapResolution = ShadowResolution._512;
// Shadows Settings
[SerializeField] float m_ShadowDistance = 50.0f;
[SerializeField] ShadowCascadesOption m_ShadowCascades = ShadowCascadesOption.NoCascades;
[SerializeField] float m_Cascade2Split = 0.25f;
[SerializeField] Vector3 m_Cascade4Split = new Vector3(0.067f, 0.2f, 0.467f);
[SerializeField] float m_ShadowDepthBias = 1.0f;
[SerializeField] float m_ShadowNormalBias = 1.0f;
[SerializeField] bool m_SoftShadowsSupported = false;
// Advanced settings
[SerializeField] bool m_UseSRPBatcher = true;
[SerializeField] bool m_SupportsDynamicBatching = false;
[SerializeField] bool m_MixedLightingSupported = true;
// Post-processing settings
[SerializeField] ColorGradingMode m_ColorGradingMode = ColorGradingMode.LowDynamicRange;
[SerializeField] int m_ColorGradingLutSize = 32;
// Deprecated settings
[SerializeField] ShadowQuality m_ShadowType = ShadowQuality.HardShadows;
[SerializeField] bool m_LocalShadowsSupported = false;
[SerializeField] ShadowResolution m_LocalShadowsAtlasResolution = ShadowResolution._256;
[SerializeField] int m_MaxPixelLights = 0;
[SerializeField] ShadowResolution m_ShadowAtlasResolution = ShadowResolution._256;
[SerializeField] ShaderVariantLogLevel m_ShaderVariantLogLevel = ShaderVariantLogLevel.Disabled;
// Note: A lut size of 16^3 is barely usable with the HDR grading mode. 32 should be the
// minimum, the lut being encoded in log. Lower sizes would work better with an additional
// 1D shaper lut but for now we'll keep it simple.
public const int k_MinLutSize = 16;
public const int k_MaxLutSize = 65;
#if UNITY_EDITOR
[NonSerialized]
internal UniversalRenderPipelineEditorResources m_EditorResourcesAsset;
public static readonly string packagePath = "Packages/com.unity.render-pipelines.universal";
public static UniversalRenderPipelineAsset Create(ScriptableRendererData rendererData = null)
{
// Create Universal RP Asset
var instance = CreateInstance<UniversalRenderPipelineAsset>();
if (rendererData != null)
instance.m_RendererDataList[0] = rendererData;
else
instance.m_RendererDataList[0] = CreateInstance<ForwardRendererData>();
// Initialize default Renderer
instance.m_EditorResourcesAsset = LoadResourceFile<UniversalRenderPipelineEditorResources>();
instance.m_Renderers = new ScriptableRenderer[1];
instance.m_Renderers[0] = instance.m_RendererDataList[0].InternalCreateRenderer();
return instance;
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")]
internal class CreateUniversalPipelineAsset : EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)
{
//Create asset
AssetDatabase.CreateAsset(Create(CreateRendererAsset(pathName, RendererType.ForwardRenderer)), pathName);
}
}
[MenuItem("Assets/Create/Rendering/Universal Render Pipeline/Pipeline Asset/Forward Renderer", priority = CoreUtils.assetCreateMenuPriority1)]
static void CreateUniversalPipeline()
{
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance<CreateUniversalPipelineAsset>(),
"UniversalRenderPipelineAsset.asset", null, null);
}
static ScriptableRendererData CreateRendererAsset(string path, RendererType type, bool relativePath = true)
{
ScriptableRendererData data = CreateRenderer(type);
string dataPath;
if (relativePath)
dataPath =
$"{Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path))}_Renderer{Path.GetExtension(path)}";
else
dataPath = path;
AssetDatabase.CreateAsset(data, dataPath);
return data;
}
static ScriptableRendererData CreateRenderer(RendererType type)
{
switch (type)
{
case RendererType.ForwardRenderer:
return CreateInstance<ForwardRendererData>();
// 2D renderer is experimental
case RendererType._2DRenderer:
return CreateInstance<Experimental.Rendering.Universal.Renderer2DData>();
// Forward Renderer is the fallback renderer that works on all platforms
default:
return CreateInstance<ForwardRendererData>();
}
}
//[MenuItem("Assets/Create/Rendering/Universal Pipeline Editor Resources", priority = CoreUtils.assetCreateMenuPriority1)]
static void CreateUniversalPipelineEditorResources()
{
var instance = CreateInstance<UniversalRenderPipelineEditorResources>();
ResourceReloader.ReloadAllNullIn(instance, packagePath);
AssetDatabase.CreateAsset(instance, string.Format("Assets/{0}.asset", typeof(UniversalRenderPipelineEditorResources).Name));
}
static T LoadResourceFile<T>() where T : ScriptableObject
{
T resourceAsset = null;
var guids = AssetDatabase.FindAssets(typeof(T).Name + " t:scriptableobject", new[] { "Assets" });
foreach (string guid in guids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
resourceAsset = AssetDatabase.LoadAssetAtPath<T>(path);
if (resourceAsset != null)
break;
}
// There's currently an issue that prevents FindAssets from find resources withing the package folder.
if (resourceAsset == null)
{
string path = packagePath + "/Runtime/Data/" + typeof(T).Name + ".asset";
resourceAsset = AssetDatabase.LoadAssetAtPath<T>(path);
}
// Validate the resource file
ResourceReloader.ReloadAllNullIn(resourceAsset, packagePath);
return resourceAsset;
}
UniversalRenderPipelineEditorResources editorResources
{
get
{
if (m_EditorResourcesAsset == null)
m_EditorResourcesAsset = LoadResourceFile<UniversalRenderPipelineEditorResources>();
return m_EditorResourcesAsset;
}
}
#endif
public ScriptableRendererData LoadBuiltinRendererData(RendererType type)
{
#if UNITY_EDITOR
EditorUtility.SetDirty(this);
return m_RendererDataList[0] =
CreateRendererAsset("Assets/ForwardRenderer.asset", RendererType.ForwardRenderer, false);
#else
m_RendererDataList[0] = null;
return m_RendererDataList[0];
#endif
}
protected override RenderPipeline CreatePipeline()
{
if (m_RendererDataList == null)
m_RendererDataList = new ScriptableRendererData[1];
// If no data we can't create pipeline instance
if (m_RendererDataList[0] == null)
{
// Could be upgrading for the first time
if (m_NeedsUpgrade)
{
UpgradeAsset(this);
}
else
{
Debug.LogError(
$"Default Renderer is missing, make sure there is a Renderer assigned as the default on the current Universal RP asset:{UniversalRenderPipeline.asset.name}",
this);
return null;
}
}
if(m_Renderers == null || m_Renderers.Length < m_RendererDataList.Length)
m_Renderers = new ScriptableRenderer[m_RendererDataList.Length];
m_Renderers[0] = m_RendererDataList[0].InternalCreateRenderer();
return new UniversalRenderPipeline(this);
}
Material GetMaterial(DefaultMaterialType materialType)
{
#if UNITY_EDITOR
if (scriptableRendererData == null || editorResources == null)
return null;
var material = scriptableRendererData.GetDefaultMaterial(materialType);
if (material != null)
return material;
switch (materialType)
{
case DefaultMaterialType.Standard:
return editorResources.materials.lit;
case DefaultMaterialType.Particle:
return editorResources.materials.particleLit;
case DefaultMaterialType.Terrain:
return editorResources.materials.terrainLit;
// Unity Builtin Default
default:
return null;
}
#else
return null;
#endif
}
public ScriptableRenderer scriptableRenderer
{
get
{
if (m_RendererDataList[m_DefaultRenderer] == null)
{
Debug.LogError("Default renderer is missing from the current Pipeline Asset.", this);
return null;
}
if (scriptableRendererData.isInvalidated || m_Renderers[m_DefaultRenderer] == null)
m_Renderers[m_DefaultRenderer] = scriptableRendererData.InternalCreateRenderer();
return m_Renderers[m_DefaultRenderer];
}
}
internal ScriptableRendererData scriptableRendererData
{
get
{
if (m_RendererDataList[m_DefaultRenderer] == null)
CreatePipeline();
return m_RendererDataList[m_DefaultRenderer];
}
}
internal ScriptableRenderer GetRenderer(int index)
{
if (index == -1) index = m_DefaultRenderer;
if (index >= m_RendererDataList.Length || index < 0 || m_RendererDataList[index] == null)
{
Debug.LogWarning(
$"Renderer at index {index.ToString()} is missing, falling back to Default Renderer {m_RendererDataList[m_DefaultRenderer].name}",
this);
index = m_DefaultRenderer;
}
if(m_Renderers == null || m_Renderers.Length < m_RendererDataList.Length)
m_Renderers = new ScriptableRenderer[m_RendererDataList.Length];
if ( m_RendererDataList[index].isInvalidated || m_Renderers[index] == null)
m_Renderers[index] = m_RendererDataList[index].InternalCreateRenderer();
return m_Renderers[index];
}
#if UNITY_EDITOR
internal GUIContent[] rendererDisplayList
{
get
{
GUIContent[] list = new GUIContent[m_RendererDataList.Length + 1];
list[0] = new GUIContent($"Default Renderer ({RendererDataDisplayName(m_RendererDataList[m_DefaultRenderer])})");
for (var i = 1; i < list.Length; i++)
{
list[i] = new GUIContent($"{(i - 1).ToString()}: {RendererDataDisplayName(m_RendererDataList[i-1])}");
}
return list;
}
}
string RendererDataDisplayName(ScriptableRendererData data)
{
if (data != null)
return data.name;
return "NULL (Missing RendererData)";
}
#endif
internal int[] rendererIndexList
{
get
{
int[] list = new int[m_RendererDataList.Length + 1];
for (int i = 0; i < list.Length; i++)
{
list[i] = i - 1;
}
return list;
}
}
public bool supportsCameraDepthTexture
{
get { return m_RequireDepthTexture; }
set { m_RequireDepthTexture = value; }
}
public bool supportsCameraOpaqueTexture
{
get { return m_RequireOpaqueTexture; }
set { m_RequireOpaqueTexture = value; }
}
public Downsampling opaqueDownsampling
{
get { return m_OpaqueDownsampling; }
}
public bool supportsHDR
{
get { return m_SupportsHDR; }
set { m_SupportsHDR = value; }
}
public int msaaSampleCount
{
get { return (int)m_MSAA; }
set { m_MSAA = (MsaaQuality)value; }
}
public float renderScale
{
get { return m_RenderScale; }
set { m_RenderScale = ValidateRenderScale(value); }
}
public LightRenderingMode mainLightRenderingMode
{
get { return m_MainLightRenderingMode; }
}
public bool supportsMainLightShadows
{
get { return m_MainLightShadowsSupported; }
}
public int mainLightShadowmapResolution
{
get { return (int)m_MainLightShadowmapResolution; }
}
public LightRenderingMode additionalLightsRenderingMode
{
get { return m_AdditionalLightsRenderingMode; }
}
public int maxAdditionalLightsCount
{
get { return m_AdditionalLightsPerObjectLimit; }
set { m_AdditionalLightsPerObjectLimit = ValidatePerObjectLights(value); }
}
public bool supportsAdditionalLightShadows
{
get { return m_AdditionalLightShadowsSupported; }
}
public int additionalLightsShadowmapResolution
{
get { return (int)m_AdditionalLightsShadowmapResolution; }
}
public float shadowDistance
{
get { return m_ShadowDistance; }
set { m_ShadowDistance = Mathf.Max(0.0f, value); }
}
public ShadowCascadesOption shadowCascadeOption
{
get { return m_ShadowCascades; }
set { m_ShadowCascades = value; }
}
public float cascade2Split
{
get { return m_Cascade2Split; }
}
public Vector3 cascade4Split
{
get { return m_Cascade4Split; }
}
public float shadowDepthBias
{
get { return m_ShadowDepthBias; }
set { m_ShadowDepthBias = ValidateShadowBias(value); }
}
public float shadowNormalBias
{
get { return m_ShadowNormalBias; }
set { m_ShadowNormalBias = ValidateShadowBias(value); }
}
public bool supportsSoftShadows
{
get { return m_SoftShadowsSupported; }
}
public bool supportsDynamicBatching
{
get { return m_SupportsDynamicBatching; }
set { m_SupportsDynamicBatching = value; }
}
public bool supportsMixedLighting
{
get { return m_MixedLightingSupported; }
}
public ShaderVariantLogLevel shaderVariantLogLevel
{
get { return m_ShaderVariantLogLevel; }
set { m_ShaderVariantLogLevel = value; }
}
public bool useSRPBatcher
{
get { return m_UseSRPBatcher; }
set { m_UseSRPBatcher = value; }
}
public ColorGradingMode colorGradingMode
{
get { return m_ColorGradingMode; }
set { m_ColorGradingMode = value; }
}
public int colorGradingLutSize
{
get { return m_ColorGradingLutSize; }
set { m_ColorGradingLutSize = Mathf.Clamp(value, k_MinLutSize, k_MaxLutSize); }
}
public override Material defaultMaterial
{
get { return GetMaterial(DefaultMaterialType.Standard); }
}
public override Material defaultParticleMaterial
{
get { return GetMaterial(DefaultMaterialType.Particle); }
}
public override Material defaultLineMaterial
{
get { return GetMaterial(DefaultMaterialType.Particle); }
}
public override Material defaultTerrainMaterial
{
get { return GetMaterial(DefaultMaterialType.Terrain); }
}
public override Material defaultUIMaterial
{
get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
}
public override Material defaultUIOverdrawMaterial
{
get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
}
public override Material defaultUIETC1SupportedMaterial
{
get { return GetMaterial(DefaultMaterialType.UnityBuiltinDefault); }
}
public override Material default2DMaterial
{
get { return GetMaterial(DefaultMaterialType.Sprite); }
}
public override Shader defaultShader
{
get
{
#if UNITY_EDITOR
// TODO: When importing project, AssetPreviewUpdater:CreatePreviewForAsset will be called multiple time
// which in turns calls this property to get the default shader.
// The property should never return null as, when null, it loads the data using AssetDatabase.LoadAssetAtPath.
// However it seems there's an issue that LoadAssetAtPath will not load the asset in some cases. so adding the null check
// here to fix template tests.
if (scriptableRendererData != null)
{
Shader defaultShader = scriptableRendererData.GetDefaultShader();
if (defaultShader != null)
return defaultShader;
}
#endif
if (m_DefaultShader == null)
m_DefaultShader = Shader.Find(ShaderUtils.GetShaderPath(ShaderPathID.Lit));
return m_DefaultShader;
}
}
#if UNITY_EDITOR
public override Shader autodeskInteractiveShader
{
get { return editorResources.shaders.autodeskInteractivePS; }
}
public override Shader autodeskInteractiveTransparentShader
{
get { return editorResources.shaders.autodeskInteractiveTransparentPS; }
}
public override Shader autodeskInteractiveMaskedShader
{
get { return editorResources.shaders.autodeskInteractiveMaskedPS; }
}
public override Shader terrainDetailLitShader
{
get { return editorResources.shaders.terrainDetailLitPS; }
}
public override Shader terrainDetailGrassShader
{
get { return editorResources.shaders.terrainDetailGrassPS; }
}
public override Shader terrainDetailGrassBillboardShader
{
get { return editorResources.shaders.terrainDetailGrassBillboardPS; }
}
public override Shader defaultSpeedTree7Shader
{
get { return editorResources.shaders.defaultSpeedTree7PS; }
}
public override Shader defaultSpeedTree8Shader
{
get { return editorResources.shaders.defaultSpeedTree8PS; }
}
#endif
public void OnBeforeSerialize()
{
}
public void OnAfterDeserialize()
{
if (k_AssetVersion < 3)
{
k_AssetVersion = 3;
m_SoftShadowsSupported = (m_ShadowType == ShadowQuality.SoftShadows);
}
if (k_AssetVersion < 4)
{
k_AssetVersion = 4;
m_AdditionalLightShadowsSupported = m_LocalShadowsSupported;
m_AdditionalLightsShadowmapResolution = m_LocalShadowsAtlasResolution;
m_AdditionalLightsPerObjectLimit = m_MaxPixelLights;
m_MainLightShadowmapResolution = m_ShadowAtlasResolution;
}
if (k_AssetVersion < 5)
{
k_AssetVersion = 5;
m_NeedsUpgrade = true;
if (m_RendererType == RendererType.Custom)
{
m_RendererDataList[0] = m_RendererData;
}
}
}
static void UpgradeAsset(UniversalRenderPipelineAsset asset)
{
#if UNITY_EDITOR
// This upgrade block moved the renderers from a single reference to the list.
if(asset.k_AssetVersion == 5)
{
if (asset.m_RendererType == RendererType.ForwardRenderer)
{
var data = AssetDatabase.LoadAssetAtPath<ForwardRendererData>("Assets/ForwardRenderer.asset");
if (data)
{
asset.m_RendererDataList[0] = data;
}
else
{
asset.LoadBuiltinRendererData(RendererType.ForwardRenderer);
}
asset.m_RendererData = null; // Clears the old renderer
}
}
#endif
asset.m_NeedsUpgrade = false;
}
float ValidateShadowBias(float value)
{
return Mathf.Max(0.0f, Mathf.Min(value, UniversalRenderPipeline.maxShadowBias));
}
int ValidatePerObjectLights(int value)
{
return System.Math.Max(0, System.Math.Min(value, UniversalRenderPipeline.maxPerObjectLights));
}
float ValidateRenderScale(float value)
{
return Mathf.Max(UniversalRenderPipeline.minRenderScale, Mathf.Min(value, UniversalRenderPipeline.maxRenderScale));
}
/// <summary>
/// Check to see if the RendererData list contains valide RendererData references.
/// </summary>
/// <param name="partial">This bool controls whether to test against all or any, if false then there has to be no invalid RendererData</param>
/// <returns></returns>
internal bool ValidateRendererDataList(bool partial = false)
{
var emptyEntries = 0;
for (int i = 0; i < m_RendererDataList.Length; i++) emptyEntries += ValidateRendererData(i) ? 0 : 1;
if (partial)
return emptyEntries == 0;
return emptyEntries != m_RendererDataList.Length;
}
internal bool ValidateRendererData(int index)
{
// Check to see if you are asking for the default renderer
if (index == -1) index = m_DefaultRenderer;
return index < m_RendererDataList.Length ? m_RendererDataList[index] != null : false;
}
}
}