LWRP 輕量級渲染
根據(jù)官方給出的PPT以及大致的說明
LWRP 是精簡并且優(yōu)化過的渲染管線肉渴、主要聚焦性能、針對移動平臺
所以開坑 LWRP,至于HDRP這個主要用于高性能的主機和PC上微渠,目前不做端游搭幻,暫不考慮
- 高性能和高一致性的PBR
- 新的Shader庫
- 一次渲染多個實時光
- 可插入 Scriptable Render Passes 的 API
Unity Test Version: 2019.3.0.f1
而 Scriptable Render Passes 是由C#代碼來完成渲染管線的編寫。在Unity 高版本中(筆者 Unity2019 3.0.f1)通過Editor -> Project Setting -> Graphices [ Scriptable Render Pipeline Settings ] 來設(shè)置我們自定義的管線配置逞盆。
示意圖:
那么 Scriptable Render Pipeline Settings 需要指定什么文件檀蹋?
在Unity中,官方的配置都是基于 ScriptableObject可序列化的配置云芦,我們先嘗試寫下代碼俯逾。
[ExecuteInEditMode]
public class BasePipelineAsset_test : RenderPipelineAsset
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("RenderPipeline/Create BasePipelineAsset")]
public static void CreateBasePipelineAsset()
{
var instances = ScriptableObject.CreateInstance<BasePipelineAsset_test>();
UnityEditor.AssetDatabase.CreateAsset(instances, "Assets/Pipelines/BasePiplineAsset.asset");
}
#endif
protected override RenderPipeline CreatePipeline()
{
return null;
}
//這是一份自定義的序列化管線配置。
}
到此我們可以通過菜單 RenderPipeline => Create BasePipelineAsset創(chuàng)建一個管線配置舅逸,之后把創(chuàng)建 OK 的配置拖入 Scriptable Render Pipeline Settings 中桌肴,為此管線配置創(chuàng)建完成,然后看看Scene 和 Game 視圖琉历。
全黑坠七!別擔(dān)心,這是沒問題的旗笔,因為此時我們還沒開始渲染任何東西彪置。
到了這一步,我們主相機沒用了嗎蝇恶?然而并不是拳魁!我們看接下來的代碼!
首先我們抽象一個基類:
public abstract class BasicRenderPipeline : RenderPipeline
{
protected CommandBuffer command;
[SerializeField] protected Color m_ClearColor;
public BasicRenderPipeline()
{
command = new CommandBuffer();
}
public BasicRenderPipeline(Color clear) : this()
{
this.m_ClearColor = clear;
}
protected override void Render(ScriptableRenderContext context, Camera[] cameras)
{
foreach (Camera c in cameras)
{
this.Render(context, c);
}
}
protected abstract void Render(ScriptableRenderContext context, Camera camera);
}
然后我們通過繼承來創(chuàng)建一個管道:
public class MainPipeline : BasicRenderPipeline
{
public MainPipeline(Color clear) : base(clear){ }
protected override void Render(ScriptableRenderContext context, Camera camera)
{
command.Clear();
command.ClearRenderTarget(true, true, this.m_ClearColor);
context.ExecuteCommandBuffer(command);
context.Submit();
}
}
這樣若后續(xù)有多條管道艘包,我們都可以通過繼承的方式來完成的猛,渲染主要寫在基類抽象出來的Render函數(shù)。
最后在 BasePipelineAsset_test 類中 CreatePipeline 函數(shù)中返回我們編寫的管道 MainPipeline
[ExecuteInEditMode]
public class BasePipelineAsset_test : RenderPipelineAsset
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("RenderPipeline/Create BasePipelineAsset")]
public static void CreateBasePipelineAsset()
{
var instances = ScriptableObject.CreateInstance<BasePipelineAsset_test>();
UnityEditor.AssetDatabase.CreateAsset(instances, "Assets/Pipelines/BasePiplineAsset.asset");
}
#endif
protected override RenderPipeline CreatePipeline()
{
return new MainPipeline(Color.grey);
}
}
這條管道僅僅是清空了顏色(灰色做基色)想虎,返回Unity卦尊,我們就可以看的效果了,但是有個問題舌厨,就是當(dāng)屏幕的分辨率不是常規(guī)像什么16:9之類岂却,會出現(xiàn)部分顏色無法清空。
異常圖一:
我們可以看的Scene視圖是已經(jīng)清空了的裙椭,但是Game視圖躏哩,scale 約趨近 1 顏色清理較為 '干凈'。
異常圖二:
當(dāng)我們嘗試縮放屏幕就會發(fā)現(xiàn)問題了揉燃,這個問題解決起來也很簡單扫尺。
在管道渲染的函數(shù)中指定設(shè)置相機的屬性,若不指定炊汤,估計我們的相機也變得沒有任何L用(作用應(yīng)該會有正驻,就是可以遍歷我們的管道 = 弊攘。=)
修改后的代碼:
public class MainPipeline : BasicRenderPipeline
{
public MainPipeline(Color clear) : base(clear){ }
protected override void Render(ScriptableRenderContext context, Camera camera)
{
command.Clear();
context.SetupCameraProperties(camera);
command.ClearRenderTarget(true, true, this.m_ClearColor);
context.ExecuteCommandBuffer(command);
context.Submit();
}
}
OK,這樣不管怎樣縮放姑曙,相機的參數(shù)都起作用了襟交,上個動圖(可能不會動)