一、RenderPipeline類
通過SRP可以實(shí)現(xiàn)對渲染管線的完全控制,它提供了需要的工具來創(chuàng)建符合項(xiàng)目需求的渲染管線和效果;通過在C#腳本中定義一系列的命令來控制每一幀的渲染過程,和傳統(tǒng)內(nèi)置管線不同,它開放了更多的接口,給了開發(fā)者更大的自由度,但是又不至于像OpenGL手寫管線那么復(fù)雜,可以很好滿足開發(fā)者既需要自定義管線又要簡單快捷的開發(fā)需求,降低了渲染管線的開發(fā)門檻;
該類用于srp中的渲染方式,它通過定義一系列的命令和設(shè)置來告訴unity怎么渲染一幀;
二、相關(guān)類
所有可編程渲染管線相關(guān)的類定義在UnityEngine.Rendering中;
1. RenderPipelineAsset
所有的管線資源都要繼承自該類,并重寫其創(chuàng)建管線的CreatePipeline()方法,返回一個(gè)RenderPipeline實(shí)例,并且需要將該值賦予到GraphicSettings,然后才可以使用這個(gè)自定義的管線來進(jìn)行渲染;
2. GraphicsSettings
它和編輯器中的Project Settings中的Graphics的設(shè)置是緊密相關(guān)的,用于以腳本的方式來進(jìn)行自動設(shè)置來代替手動設(shè)置;所以,它提供的屬性和方法都是和設(shè)置面板相對應(yīng)的;例如,創(chuàng)建一條管線后,就可以通過GraphicsSettings.renderPipelineAsset來將其設(shè)置為當(dāng)前的渲染管線;
3. RenderPipeline
核心類,可編程的渲染管線的具體流程在此定義,所有的可編程渲染管線繼承自該類,在創(chuàng)建新的管線資源時(shí),需要使用到該類的子類進(jìn)行實(shí)例化;
4. ScriptableRenderContext
渲染上下文,在自定義渲染管線中定義一些狀態(tài)和渲染命令,然后調(diào)用Submit函數(shù)提交到GPU;這個(gè)上下文的概念類似于OpenGL中上下文的概念,定義渲染管線要使用的許多狀態(tài)以及繪制命令,相當(dāng)于整個(gè)渲染的manager;
SetupCameraProperties(camera):相機(jī)的配置是第一步,設(shè)置相機(jī)的屬性,獲取一個(gè)相機(jī)實(shí)例后,就可以獲取它的觀察矩陣(transform)和裁剪矩陣(clip plane等)等屬性值;
5. CommandBuffer
它的出現(xiàn)早于SRP,在沒有SRP時(shí),它用于對unity內(nèi)置的渲染管線進(jìn)行擴(kuò)展;該緩沖區(qū)用于存儲一系列渲染命令,然后提交到渲染上下文中;
使用步驟:創(chuàng)建緩沖區(qū)-設(shè)置-提交-釋放緩沖區(qū)
CommandBuffer buf=new CommandBuffer(); //設(shè)置渲染命令.... context.ExecuteCommandBuffer(buf) //非立即執(zhí)行 buf.Release()
6. SortSettings
設(shè)置場景中物體的排序方式,使用默認(rèn)方式和使用自定義方式
默認(rèn)方式,設(shè)置criteria,這是一個(gè)SortingCriteria枚舉類型,包含了透明物體(從前到后)、半透明(從后到前);
自定義方式,設(shè)置cameraPosition、customAxi、worldToCameraMatrix三個(gè)變量聯(lián)合使用;
三、第一步-完成一個(gè)最基礎(chǔ)的渲染管線
創(chuàng)建命令緩沖區(qū),如下,設(shè)置清空渲染目標(biāo)的命令;
剔除操作,通過相機(jī)獲取剔除參數(shù),剔除場景中的不可見物體;
繪制命令,繪制前需要對場景中的物體進(jìn)行排序,為不同的物體設(shè)置不同的排序方式,比如半透明物體要從后到前渲染;在DrawingSettings中,構(gòu)造函數(shù)第一個(gè)參數(shù)為ShaderTagId類型,也就是要使用的pass的tag的Id值,以及排序的設(shè)置;FilteringSettings則設(shè)置渲染隊(duì)列的范圍,用于設(shè)置哪些物體將會被渲染,如下例子,將透明和半透明分開進(jìn)行渲染;
注意:天空盒的渲染在不透明物體之后,在半透明物體之前;
var cmd = new CommandBuffer(); CameraClearFlags clearFlags = camera.clearFlags; cmd.ClearRenderTarget((CameraClearFlags.Color&clearFlags)!=0,(CameraClearFlags.Depth&clearFlags)!=0,camera.backgroundColor); context.ExecuteCommandBuffer(cmd); cmd.Release(); context.SetupCameraProperties(camera); //剔除 ScriptableCullingParameters cullingPrama; camera.TryGetCullingParameters(out cullingPrama); CullingResults cullRet = context.Cull(ref cullingPrama); //繪制 SortingSettings sortSettings = new SortingSettings(camera); sortSettings.criteria = SortingCriteria.CommonOpaque; DrawingSettings drawSettings = new DrawingSettings(new ShaderTagId("BasicPass"),sortSettings); FilteringSettings filterSettings = new FilteringSettings(RenderQueueRange.opaque); context.DrawRenderers(cullRet,ref drawSettings,ref filterSettings); context.DrawSkybox(camera); sortSettings.criteria = SortingCriteria.CommonTransparent; drawSettings.sortingSettings = sortSettings; filterSettings.renderQueueRange = RenderQueueRange.transparent; context.DrawRenderers(cullRet,ref drawSettings,ref filterSettings); context.Submit();
-
gpu
+關(guān)注
關(guān)注
28文章
5194瀏覽量
135424 -
編輯器
+關(guān)注
關(guān)注
1文章
828瀏覽量
32895 -
Unity
+關(guān)注
關(guān)注
1文章
131瀏覽量
23295
發(fā)布評論請先 登錄
探索BUF08832:可編程電壓參考的卓越之選
Zynq全可編程片上系統(tǒng)詳解
YXC高精度的石英可編程壓控溫補(bǔ)振蕩器:YSV531PT系列
思爾芯邀您共聚 FPT 2025,賦能可編程技術(shù)新未來
源儀電子S7220交直流可編程電源產(chǎn)品介紹
可編程負(fù)載:實(shí)驗(yàn)室與生產(chǎn)的高效測試助手
用于 DOCSIS 3.0 上行路徑的可編程增益放大器 skyworksinc
MT6501在線可編程角度編碼器:以獨(dú)特可編程特性提升汽車控制精度與可靠性
吉事勵(lì)可編程交流恒流源原理及特點(diǎn)介紹
吉事勵(lì)可編程交流恒流源特點(diǎn)介紹
可編程SLIC語音芯片哪家好?
愛普生可編程晶振產(chǎn)品如何選擇
吉事勵(lì)可編程變頻電源的特性與應(yīng)用
可編程電子負(fù)載的原理及主要應(yīng)用
愛普生SG-8101CE可編程晶振的應(yīng)用領(lǐng)域介紹
Unity可編程渲染管線SRP具體流程介紹
評論