SlideShare una empresa de Scribd logo
1 de 22
如何客製化URP渲染流程
廖峻漢
Outline
● 什麼是ScriptableRenderPass?
● URP客製化渲染流程架構
● 如何在URP下加ScriptableRenderPass?
● 如何實作ScriptableRenderPass?
● Shader相關實作
● 動態加Pass架構
● URP與默認渲染管線的一些區別
什麼是ScriptableRenderPass?
用於擴展URP的邏輯渲染通道類,透過執行自定
義的RenderPass來達到客製化渲染流程的目標
常規的渲染流程 畫非透明
畫天空盒
畫透明
由前到後排序,寫入深
度值
檢測深度值,避免
OverDraw
由後到前排序,顯示透
明混合效果
URP客製化渲染流程架構
URP渲染流程
…
1. m_RenderOpaqueForwardPass
2. m_DrawSkyboxPass
3. m_RenderTransparentForwardPass
…
4.CustomRenderFeaturs:
for (int i = 0; i < rendererFeatures.Count; ++i)
…
rendererFeatures[i].AddRenderPasses(this, ref
renderingData);
如何在URP下加ScriptableRenderPass?
1. 實作RenderFeature
2. 覆寫AddRenderPasses function(EnQueuePass)
如何實作ScriptableRenderPass?
1. 決定RenderEvent
2. 定義ProfilingSampler
3. 覆寫Execute function
4. 相關CommandBuffer實作
5. FilteringSetting(非必要,涉及畫物件才會用到)
6. ShaderTagID(非必要,涉及畫物件才會用到)
7. 覆寫Configure function(非必要,涉及建立或設定渲染畫布-
RenderTarget才會使用)
8. 覆寫OnCameraCleanup(非必要,涉及釋放RenderTarget才會使用)
以DrawOutlinePass為例
決定RenderEvent
enum RenderEvent
{
BeforeRenderingShadows = 50,
AfterRenderingShadows = 100,
//…
BeforeRenderingOpaques = 250,
AfterRenderingOpaques = 300,
BeforeRenderingSkybox = 350,
AfterRenderingSkybox = 400,
BeforeRenderingTransparents = 450,
AfterRenderingTransparents = 500,
//…
}
public DrawOutLinePass()
{
renderPassEvent =
RenderPassEvent.Bef
oreRenderingOpaques;
…
}
設定FilteringSetting
public DrawOutLinePass()
{
…
m_filteringSettings = new
FilteringSettings(RenderQueueRange.opa
que, ~0);
…
}
ShaderTagId
public DrawOutLinePass()
{
…
m_shaderTagId = new
ShaderTagId("OutLine");
…
}
public DrawOutLinePass()
{
…
m_profilingSampler = new ProfilingSampler(m_profilerTag);
}
覆寫Execute function及CommandBuffer實作
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer command = CommandBufferPool.Get(m_profilerTag);
using (new ProfilingScope(command, m_profilingSampler))
{
context.ExecuteCommandBuffer(command);//這裡要先執行一下,否則不會有記錄
command.Clear();//需要清除,否則會積命令
var sortFlags = renderingData.cameraData.defaultOpaqueSortFlags;
var drawSettings = CreateDrawingSettings(m_shaderTagId, ref renderingData, sortFlags);
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref m_filteringSettings);
}
context.ExecuteCommandBuffer(command);//其實這裡是不需要執行的,沒命令
CommandBufferPool.Release(command);//釋放命令
}
Shader相關實作-TestOutline.Shader
Shader "TestOutline"
{
SubShader
{
…
Pass
{
…
}
Pass
{
…
Tags{"LightMode" = "OutLine"}
Cull front
…
#include "TestOutlineImpl.hlsl"
…
}
}
}
Shader相關實作-TestOutlineImpl.hlsl
VertexOutput VertexProgram(VertexInput input)
{
VertexOutput output = (VertexOutput)0;
real3 normal = normalize(input.normalOS);
float3 positionOS = input.positionOS.xyz;
positionOS += normal * 0.03;//0.03為輪廓的粗細
output.positionCS = TransformObjectToHClip(positionOS);
return output;
}
動態加Pass架構-常規RenderFeature資料驅動的做法
動態加Pass架構-常規RenderFeature資料驅動的問題
O 戰爭迷霧效果
O 高光效果
X 鏡頭前雨滴效果後處理
X 見血效果
O 投射雲陰影效果
動態加Pass架構-相關實作
class DynamicAddPassFeature : ScriptableRendererFeature{
…
public override void AddRenderPasses(…)
{
var element = ms_addPassInterfaces.GetEnumerator();
while (element.MoveNext())
element.Current.OnAddPass(renderer, ref renderingData);
element.Dispose();
}
private static LinkedList<IAddPassInterface> ms_addPassInterfaces =
new LinkedList<IAddPassInterface>();
動態加Pass架構-相關介面
public interface IAddPassInterface {
void OnAddPass(ScriptableRenderer renderer, ref RenderingData
renderingData);
};
public static bool AppendAddPassInterfaces(IAddPassInterface theInterface)
{
…
}
public static bool RemoveAddPassInterfaces(IAddPassInterface theInterface)
{
…
}
URP與默認管線的一些區別
● 不支持GrabPass
● URP支持RenderScale
● URP不支持Auto MultiPass
● 兩者都支持ShadowCaster
相關Github連結
DynamicAddPassFeature
謝謝大家

Más contenido relacionado

La actualidad más candente

A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemBo Li
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기강 민우
 
아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더포프 김
 
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들강 민우
 
Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?SangYun Yi
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
Unityのサウンド状況を調べまくって分かったアレコレ
Unityのサウンド状況を調べまくって分かったアレコレUnityのサウンド状況を調べまくって分かったアレコレ
Unityのサウンド状況を調べまくって分かったアレコレTakaaki Ichijo
 
UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!sawat1203
 
Weighted Blended Order Independent Transparency
Weighted Blended Order Independent TransparencyWeighted Blended Order Independent Transparency
Weighted Blended Order Independent Transparencyzokweiron
 
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들Dae Hyek KIM
 
「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発Unity Technologies Japan K.K.
 
Unity Analyticsの使い方
Unity Analyticsの使い方Unity Analyticsの使い方
Unity Analyticsの使い方Makoto Ito
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용JP Jung
 
Automatic Generation of Game Content using a Graph-based Wave Function Collap...
Automatic Generation of Game Content using a Graph-based Wave Function Collap...Automatic Generation of Game Content using a Graph-based Wave Function Collap...
Automatic Generation of Game Content using a Graph-based Wave Function Collap...Hwanhee Kim
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019devCAT Studio, NEXON
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略Takayasu Beharu
 

La actualidad más candente (20)

A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering System
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
 
아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더
 
MipMap(밉맵)
MipMap(밉맵)MipMap(밉맵)
MipMap(밉맵)
 
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
 
Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?
 
카툰 렌더링
카툰 렌더링카툰 렌더링
카툰 렌더링
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
Unityのサウンド状況を調べまくって分かったアレコレ
Unityのサウンド状況を調べまくって分かったアレコレUnityのサウンド状況を調べまくって分かったアレコレ
Unityのサウンド状況を調べまくって分かったアレコレ
 
UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!
 
Weighted Blended Order Independent Transparency
Weighted Blended Order Independent TransparencyWeighted Blended Order Independent Transparency
Weighted Blended Order Independent Transparency
 
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들
Ndc17 - 차세대 게임이펙트를 위해 알야아할 기법들
 
「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発
 
Unity Analyticsの使い方
Unity Analyticsの使い方Unity Analyticsの使い方
Unity Analyticsの使い方
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
 
Automatic Generation of Game Content using a Graph-based Wave Function Collap...
Automatic Generation of Game Content using a Graph-based Wave Function Collap...Automatic Generation of Game Content using a Graph-based Wave Function Collap...
Automatic Generation of Game Content using a Graph-based Wave Function Collap...
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略
 

Último

1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...
1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...
1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...微信 tytyqqww业务接单
 
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdf
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdftaibif_開放資料流程-清理資料01-通則_20240509_20240509.pdf
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdfjhujyunjhang
 
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂PUAXINYEEMoe
 
taibif_資料標準概念介紹_20240509_20240509_20340509.pdf
taibif_資料標準概念介紹_20240509_20240509_20340509.pdftaibif_資料標準概念介紹_20240509_20240509_20340509.pdf
taibif_資料標準概念介紹_20240509_20240509_20340509.pdfjhujyunjhang
 
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习PUAXINYEEMoe
 
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个michaelell902
 
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade SixMath Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six611002610
 
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...微信 tytyqqww业务接单
 
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptxbusinesshealthwise
 

Último (9)

1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...
1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...
1.🎉成绩单,你的成绩! 💡🔥每个人都有自己的成绩单,它记录着我们努力的成果。但有时候,看着这些数字,却发现它们好像在嘲笑我?别担心,让我来告诉你们怎么改...
 
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdf
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdftaibif_開放資料流程-清理資料01-通則_20240509_20240509.pdf
taibif_開放資料流程-清理資料01-通則_20240509_20240509.pdf
 
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂
1.1.3急救你必须懂四年级设计与工艺练习活页练习单元一四年级设计与工艺急救你必须懂
 
taibif_資料標準概念介紹_20240509_20240509_20340509.pdf
taibif_資料標準概念介紹_20240509_20240509_20340509.pdftaibif_資料標準概念介紹_20240509_20240509_20340509.pdf
taibif_資料標準概念介紹_20240509_20240509_20340509.pdf
 
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习
10.2.1 马来西亚各州名称的由来六年级历史单元练习马来西亚各州名称的由来练习
 
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个
法国蒙彼利埃国家高等建筑学院毕业证制作/德语歌德B1证书/加拿大新斯科舍省农业学院文凭加急制作一个
 
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade SixMath Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six
Math Chapter3-教學PPT第03單元形體關係、體積與表面積Grade Six
 
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...
1.🎉“黑客”如何修改成绩?🤔🎉 在这个信息爆炸的时代,我们经常会看到各种作弊手段。但是你知道吗?有一种作弊方式可能比你想象中更巧妙:它就是——黑客![单...
 
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx
啟思中國語文 - 中二 單元一 - 孟嘗君列傳 - 記敍的方法和人稱1.pptx
 

如何客製化URP渲染流程.pptx

Notas del editor

  1. 大家好,很高興今天有機會跟大家分享 『如何客製化URP渲染流程?』 過程中如不清楚的地方請隨時提問,謝謝。
  2. 首先我們來看一下大綱的部份, 一開始會先介紹什麼是ScriptableRenderPass 接下來是URP客製化渲染流程架構 再來是如何在URP下加RenderPass及相關實作 最後我們會探討一下動態加Pass架構及默認管線一些不同的地方
  3. 那什麼是ScriptableRenderPass, 它是用於擴展URP的邏輯渲染通道類別, 透過執行自定義的RenderPass來達到客製化渲染流程的目標
  4. 這邊我們來回憶一下常規的渲染流程, 基本上就是先畫非透明物件,再畫天空盒,最後畫透明物件, 先畫透明物件主要就是先寫入深度值,讓之後畫的物件, 可以透過深度檢測來避免OverDraw, 另外也會做由前到後排序,可以讓避免OverDraw的效果極大化, 再來是畫天空盒,由於之前畫非透明物件,已經寫入深度值, 所以有寫深度的像素都不會執行到pixel shader,避免OverDraw 最後是畫透明物件,為了顯示正確的透明混合效果, 我們需要做由後到前的排序,這時也不需要寫入深度值, 只會做深度檢測,來正確顯示和非透物件的混色效果
  5. 接下來我們來看一下URP客製化渲染流程架構, 上面灰色的部份,是URP默認的一些RenderPass, 跑完後,他會執行所有RenderFeature的 AddRenderPasses function, 這樣我們就可以將客製化的pass加到Renderer中
  6. 再來是在URP下加ScriptableRenderPass, 首先是實作RenderFeature, RenderFeature是ScriptableRenderPass的載體, 它是一個ScriptableObject, 所以我們可以透過它來存放渲染資料, 比方ScriptableRenderPass、材質或相關自定義參數。 接下來是覆寫AddRenderPass function, 並將自定義的pass透過EnQueuePass這個function加到Renderer中。
  7. 緊接著我們看一下如何實作ScriptableRenderPass? 首先我們要先決定RenderEvent, 後面我們會針對這一部份進行說明 再來是定義ProfilingSampler,這個類別很重要, 他涉及frameDebuger的顯示(主要是用來查看渲染流程) 然後是覆寫Execute function,pass主要代碼都是寫在這個地方 接下來是CommnadBuffer的實作,後面我們會用一個例子來說明如何透過CommandBuffer來驅動相關的繪圖命令 另外FilterSetting及ShaderTagID,是有關渲染物件才會用到的data,一樣是透過後面的例子來介紹 最後是覆寫Configure及OnCameraCleanup function,這部份主要是涉及建立、切換、釋放渲染畫布才會使用到,這一次不會針對這一部份進行相關說明
  8. 這邊我們用一個渲染外輪廓效果的pass來當例子,接下來我們就來進行相關流程說明
  9. 首先我們要先決定RenderEvent,可以從左邊看到相關的RenderEvent ID, 常規先畫Opaque=>再畫SkyBox=>最後畫transparency的這個流程, 是跟這邊的ID順序是相同,另外可能有人會問, 那Shader的RenderQueue和RenderEvent有什麼不同, 基本上RenderQueue在URP下是RenverEvent的 子流程,也就是先確定RenderEvent的順序才去探討RenderQueue的順序, 這部份我們也可以在FrameDebuger觀察其相關順序性
  10. 再來是FilteringSetting,主要是用來過濾符合渲染順序及LayerMask的物件才進行渲染,這裡的例子是當RenderQueue為opaque及任易的LayerMask
  11. 再來是ShaderTagId,主要是用來過濾符合對應的ShaderTageID,才會進行渲染,這部份會跟Shader Pass裡的LightMode tag相呼應, 之後在介紹Shader相關實作的部份會提到
  12. 接下來是ProfilingSampler,主要是用來記錄渲染流程,如果沒有它的話,雖然還是能正常渲染,但就不會出現在FrameDebuger中, 這個對除錯渲染流程幫助很大 可以看到在FrameDebug視窗裡有相關的執行除錯資料,如果沒有ProfilingSampler就不會顯示
  13. 最後是Execute function及CommandBuffer相關實作,基本上,我們是透過CommandBuffer跟ScriptableRenderContext 這個介面來跟底層繪圖API溝通, 不過有些API命令是不需要透過CommandBuffer,通常是一些畫物件的命令,比方DrawRenderers, 這裡我們透過Opaque sortflags及剛剛我們設定好的ShaderTageID來建立drawSetting, 並將其和filterSetting帶入到DrawRenderers來進行Outline pass的渲染, 上面可以看到我們有先執行一次CommandBuffer,主要的目的是為了記錄渲染流程,因為DrawRenderers本身沒透過CommandBuffer來執行, 這樣FrameDebuger不會顯示出來,另外可以看到倒數第二行的代碼其實是不必要的,因為根本沒命令,不過為了對稱代碼的習慣,我們這邊還是加入了相關代碼, 最後是釋放CommandBuffer
  14. 再來我們來看一下Shader代碼相關實作,可以看到我們這邊額外加了一個Pass,並將其LightMode tag指定為OutLine,這個跟我們剛剛的ShaderTagId相呼應, 利用這個方式我們就可以來渲染我們的OullinePass,上面的Pass是常規的URP opaque pass,也就是這個物件總共會被畫二次
  15. 最後我們來帶一下相關Vertex實作的部份,如上述的代碼,這裡只是很簡單地以法線來往外延伸點的位置, 沒做什麼特別的事
  16. 接下來我們來探討一下動態加Pass這個議題, 上圖可以看到這是常規RenderFeature的做法, 他是透過資料的方式來達到加Pass的目的, 所以我們需要事先將RenderFeature資料定義好在PipelineAssetData中, 在執行時期的時候我們完全沒辦法存取RenderFeature。 也就是他是事先定義好資料,之後只能透過切換資料來滿足切換pass的需求。 在實務上,可能會有動態加pass的需求,比方畫面濺血效果或畫面雨滴效果之類… 它是透過遊戲邏輯或環境變化造成的。
  17. 再來我們來探討一下RenderFeature資料驅動的問題,由上面的表格,我們可以看到有五種效果, 如果要做到全部的效果能動態開關, 我們就需要2的5次方組合結果資料,非常麻煩… 所以接下來我們引入了一個動態加Pass的架構
  18. 接下來是動態加Pass架構的實作, 為了不動到底層URP的代碼, 我們一樣透過RenderFeature來處理, 不同的是, 我們這邊提供了一個passInterface的容器, 讓使用者可以透過全域的方式將interface加入, 來傾聽相關加Pass的事件, 這樣就可以達到動態加Pass的目標
  19. 最後我們來看一下相關介面, 我們只要繼承IAddPassInterface這個介面就行, 另外可以看到這裡我們提供了增加及移除interface的function, 所以我們就可以在執行時期向DynamicAddPassFeature註冊介面 ,來傾聽AddPass事件, 達到動態加入客製化Pass的目標, 之後使用者只要實作OnAddPass這個function就行
  20. 接下來我們來探討一下URP與默認管線的一些區別, 首先是GrabPass, 熟悉它的人應該都知道,他常常被應用在UI背景模糊處理,目前URP並不支持GrabPass, 不過我們可以透過ScriptableRenderPass的方式來達到相同的目的, 但由於URP目前無法介入UI的渲染流程, 所以目前做不到默認管線UI grabpass的功能 再來關於RenderScale的部份,在默認管線我們通常會透過降低Resolution的方式來達到優化性能的目標, 但這樣會造成UI會變模糊,而URP則是把3d渲染和UI拆開,所以我們可以透過調整RenderScale的參數, 來達到優化性能的目標,但卻不會造成UI的解析度受到影響 接下來是MultiPass的部份,URP是不會像默認管線那樣自動執行multiPass,需要自己寫 ScriptableRenderPass呼叫 最後是關於ShadowCaster的部份, URP也是一樣利用這個Pass來畫影子, 在默認管線下, 只有類似像這些被定義好的tag才有作用, SRP的話則是可以任易定義,且交給你自行管理
  21. 我的分享到這邊結束,謝謝大家