【GTMF2018TOKYO】ScriptableRenderPipelineでアプリに最適な描画をしよう

>100 Views

July 12, 18

スライド概要

2018/7/13に開催されたGTMF2018TOKYOの講演資料です。
講師:黒河 優介(ユニティ・テクノロジーズ・ジャパン合同会社)

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2018/7/13 ScriptableRenderPipelineでアプリに最適な描画をしよう 講演者名 黒河 優介 所属団体 Unity Technologies Japan 肩書・役職 Developer Relation Engineer

2.

‫➜‪荈䊹稱‬‬ ‫‪• 䕵耵‬‬ ‫‪ٝさず⠓爡‬ػٍآ‪٥‬ؤ‪٦‬آٗظؙذ‪٥‬؍ذصِ •‬ ‫‪٦‬ػحٗكرؚ‪ٝ‬؍ذٕ؟‪ٝ‬؝ؤ؎ٓف‪٦‬ة‪ؒٝ‬‬ ‫‪،‬صآ‪ٍ٦ؒٝ‬آ‪٦‬طو‪ّٝ‬ء‪ٖٔ٦‬‬ ‫‪• ➬✲ⰻ㺁‬‬ ‫⹡‪噟‬ز‪٦‬ه؟ךزؙؑآٗف‪• 㣐鋉垷‬‬ ‫ׅ‪ꟼ‬חأ‪ٝ‬و‪ؓ٦‬ؿػ‪ծ‬ד‪さֲ䕎‬חزؙؑآٗف •‬ ‫׷ְג׏‪遤‬׾‪䲿周瘝‬׷‬

3.

劤傈‫ך‬،‫ؑآ‬ٝ‫ت‬ • Unity‫ךزٕؓؿر‬RenderPipeline‫ךד‬䲽歗‫גְאח‬ • ScriptableRenderPipeline(SRP)‫ך‬稱➜ • ‫؛‬٦‫؍رةأأ‬

4.

※劤傈‫ כ‬Forward Rendering ‫ח‬ ꣲ㹀‫ג׃‬鑧‫׾‬鹌‫ׅתְֹג׭‬

5.

‫גְאח‪䲽歗‬ךزٕؓؿر‪Unity‬‬ ‫גְאח‪ⵖ䖴‬ך‪• 䲽歗갫‬‬ ‫גְאחְ‪䪔‬ךز؎ٓ •‬ ‫גְאחְ‪䪔‬ך‪• Shadow‬‬

6.

䲽歗갫‫ך‬鑧 㛇劤涸‫ٕז‬٦ٕ Opaque‫زؙؑآـؔז‬䩛⵸ַ‫׵‬㤴‫פ‬ → Depth Test‫ד‬䲽歗꬗琎‫׾‬幾‫׭׋ׅ׵‬ Transparent‫زؙؑآـؔז‬㤴ַ‫׵‬䩛⵸‫פ‬ →䲽歗‫ך‬灶笼‫׾‬꣇ּ‫׭׋‬

7.

Opaque‫כ‬ծ䩛⵸ַ‫׵‬㤴‫פ‬

8.

Opaque‫כ‬ծ䩛⵸ַ‫׵‬㤴‫פ‬

9.

Opaque‫כ‬ծ䩛⵸ַ‫׵‬㤴‫פ‬

10.

Opaque‫כ‬ծ䩛⵸ַ‫׵‬㤴‫פ‬ Z-Buffer‫ךפ‬剅ֹ鴥‫׫‬ծZTest‫׾‬剣⸬‫דך׷ְג׃ח‬ծ ⳿勻‫׷‬ꣲ‫ ׶‬Z-Test‫׾‬剣⸬崞欽‫ג׃‬㝢‫ٕإؙؾ׷‬侧‫׾‬幾‫׵‬ ‫ח׭׋ׅ‬䩛⵸ַ‫׵‬㤴‫פ‬䲽歗‫׷ְג׃חֲ״׷ׅ‬

11.

Transparent‫כ‬ծ㤴ַ‫׵‬䩛⵸‫פ‬

12.

Transparent‫כ‬ծ㤴ַ‫׵‬䩛⵸‫פ‬

13.

Transparent‫כ‬ծ㤴ַ‫׵‬䩛⵸‫פ‬

14.

Transparent‫כ‬ծ㤴ַ‫׵‬䩛⵸‫פ‬ 㤴ַ‫׵‬䩛⵸‫פ‬剅ֻ‫ה‬ 姻‫ֻ׃‬䲽歗ׁ‫ׅתְג׸‬ 䩛⵸ַ‫׵‬㤴‫פ‬剅ֻ‫ה‬ ꅾ‫׋׏ז‬鿇ⴓ‫ך‬䲽歗ָ灶笼‫׃‬ ‫ׅתְג‬

15.

‫ֲ׮‬㼰‫׃‬稢ַֻ䲽歗갫‫ⵖך‬䖴‫ְ׋׃׾‬㜥さ • • • • • 醱侧‫ך‬Camera‫׾‬縧ְ‫ג‬Depth⦼‫ⵖד‬䖴 Renderer‫ך‬sortingLayerName‫ⵖד‬䖴 Renderer‫ך‬sortingOrder‫ⵖד‬䖴 MeshRenderer‫ך‬sortingOrder‫ⵖד‬䖴 Material.renderQueue‫ⵖד‬䖴

16.

‫ֲ׮‬㼰‫׃‬䲽歗갫‫ⵖך‬䖴‫ְ׋׃׾‬㜥さ 地面の部分は3つのオブジェクトを描画後に描画して、塗るピクセル数を 減らしてほしいが、一番最初に描画されてしまっています。

17.

‫ֲ׮‬㼰‫׃‬䲽歗갫‫ⵖך‬䖴‫ְ׋׃׾‬㜥さ これはRendererのBoundingBoxの中心位置で手前・奥の判定を行っている ため、地面が一番手前と判定されてしまっています。

18.

椚䟝‫ך‬䲽歗‫ך‬䕎 まず最初に三つのオブジェクトが描画されて…

19.

椚䟝‫ך‬䲽歗‫ך‬䕎 その後に地面が描画されることが理想形です。

20.

Unity‫ٕך‬٦ٕ‫׾‬擾濼‫הְזְג׃‬ 䲽歗‫ך‬갫殢ָⵖ䖴‫…ְזֹד‬

21.

‫גְאחְ‪䪔‬ךز؎ٓ‬ ‫‪պ‬ؚ‪ٝ‬؍ذ؎ٓךדأ‪٦‬ك‪ծչvertex‬כز؎ٓز‪؎ٝ‬ه‬ ‫ׅתְ‪遤‬׾‪Ⳣ椚պ‬ךד‪⸇皾さ䧭‬ךⴓ‪ְ鿇‬׷‪չ僇‬כֻ׃׮‬

22.

僇‫ְ׷‬鿇ⴓ‫⸇ך‬皾さ䧭 このようにポイントライト3つ あるシーンを描画する場合…

23.

僇‫ְ׷‬鿇ⴓ‫⸇ך‬皾さ䧭 まず、ポイントライト適応前の状態を描画します

24.

僇‫ְ׷‬鿇ⴓ‫⸇ך‬皾さ䧭 その後、ポイントライト一つ一つ当たった状態のオブ ジェクトを描画して加算合成していきます。 そのため余計な描画負荷を伴います

25.

Point Light....

26.

Shadow‫ך‬䪔ְ‫גְאח‬ Shadowワ‫Ⳣך׶‬椚‫כ‬ծ‫أؙحنؙحٓـו׿הק‬ QualitySettings‫ד‬鏣㹀‫׾‬䒚‫כהֿ׷‬〳腉

27.

‫ֲ׮‬㼰‫׃‬Shadow䒚‫…ְ׋׶‬

28.

‫׷ׅ‪ꟼ‬ח‪ծ䲽歗‬כד‪Unity‬ךדת׸ֿ‬ ‫‪կ‬׋׃ת‪⳿勻‬כ‪鏣㹀‬ך⦼‬ ‫ד‪ٝⰻ鿇‬آ‪ؒٝ‬כ‪ָծ䲽歗Ⳣ椚荈⡤‬‬ ‫‪կ‬׋׃דأؙحنؙحٓـ׶ֶגׄ‪ꟗ‬‬

29.

ScriptableRenderPipeline(SRP)‫ך‬稱➜ • SRP荈⡤‫ך‬堣腉‫׾‬稱➜ • LightWeightRenderPipeline(LWRP)‫ך‬稱➜ • ‫➭ך׉‬稱➜

30.

‫➜‪堣腉稱‬ך‪SRP‬‬ ‫ؙأ׾׸‪崧‬ך‪♴鎸Ⳣ椚‬ך‪䲽歗‬׋ְג׸׻‪遤‬ד‪ٝ‬آ‪ⰻ鿇ؒٝ‬ך‪• Unity‬‬ ‫ׅד‪堣腉ָSRP‬׷זחֲ״׷‪⳿勻‬ؤ؎وةأؕדزفٔ‬ ‫ؚ‪• ؕٔٝ‬‬ ‫ؚ‪ٔٝ‬ت‪ٖٝ‬ךزؙؑآـؔ •‬ ‫‪Ⳣ椚‬ך‪• Shadow‬‬ ‫ؚ‪ٝ‬ءحإٗفزأه •‬

31.

SRP‫כד‬䲽歗‫ך‬崧‫דزفؙٔأ׾׸‬剅ֽ‫ׅת‬ // 描画時にコールバックされます。引数contextに対して描画命令を発行していきます void OnRender(ScriptableRenderContext context, Camera[] cameras) { foreach (var camera in cameras){ // まず Camera毎のShader のパラメーターセットアップして… SetupShaderParams(camera); // スクリプトで決めたルールでカリングをして… var res = CullResults.Cull(ref cullingParams, context, ref cull); // そしてカリングして得た Rendererを引数で指定したルールで描画します context.DrawRenderers(res.visibleRenderers, ref settings, filterSettings); } }

32.

SRP‫ך‬㼪Ⰵ倯岀 1.RenderPipelineAsset/RenderPipeline‫׾‬竰䪫‫׾أؙٓ׋׃‬ ‫׸׊׸׉‬杝荈‫ח‬㹀纏‫ׅת׃‬ 2. RenderPipelineAsset‫׾‬竰䪫‫ךأؙٓ׋׃‬Asset‫׾‬⡲䧭‫׃‬ծ GraphicsSettings.renderPipelineAsset‫ׅת׃زحإח‬ 3.Shader‫׾‬杝荈‫ך‬Renderpipeline‫ח‬さ‫גׇ׻‬ծ LightMode‫ך‬剅ֹ䳔ִ‫ׅת‬

33.

1.竰䪫‫׾أؙٓ׋׃‬㹀纏‫ׅת׃‬ [ExecuteInEditMode] public class MySRPAsset : RenderPipelineAsset{ protected override IRenderPipeline InternalCreatePipeline(){ return new MyScriptableRenderPipelineInstance(); } } public class MyScriptableRenderPipelineInstance : RenderPipeline{ // 描画のタイミングでコールバックされます public override void Render(ScriptableRenderContext context, Camera[] cameras){ base.Render(context, cameras); foreach (var camera in cameras){ // 描画処理をここに書いていきます } } }

34.
[beta]
2-1. GraphicsSettings‫ד‬鏣㹀
var instance = ScriptableObject.CreateInstance<MySRPAsset>();
AssetDatabase.CreateAsset(instance, "Assets/MyScriptableRenderPipeline.asset");

上記のようなEditor拡張で、独自のRenderPipelineAsset
のアセットを作成します

35.

2-2. GraphicsSettings‫ד‬鏣㹀 先ほど作成したRenderPipelineAssetを指定します

36.

3. Shader‫ך‬剅ֹ䳔ִ RenderPipeline⩎‫ ד‬Renderer‫׾‬䲽歗‫ךֹה׷ׅ‬鏣㹀‫ח‬ծShaderPassName ‫׾‬床‫ׅתְג׃‬կ‫דהֿ׷ֲׅ׉‬ծ⟣䠐‫ך‬갫殢‫ךד‬Pass䲽歗ָ〳腉‫׏זח‬ ‫ׅתְג‬կ ‫׭׋ך׉‬ծShader⩎‫כח‬Pass‫ך‬せ⵸‫׾‬LightMode‫ד‬僇爙涸‫ח‬䭷㹀‫׷ׅ‬䗳銲 ָ֮‫ׅת׶‬կ

37.
[beta]
C#側の処理
var settings = new DrawRendererSettings(camera, new ShaderPassName("BasicPass"));
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true)
{
renderQueueRange = RenderQueueRange.opaque,
layerMask = 1 << LayerDefine.BG
};
context.DrawRenderers(cull.visibleRenderers, ref settings, filterSettings);
Shader側
SubShader{
Tags { "Queue"=“Geometry" "RenderType"=“Opaque"}
Pass{
Tags { "LightMode" = "BasicPass"}
....処理等
}
}

38.
[beta]
C#側の処理
var settings = new DrawRendererSettings(camera, new ShaderPassName("BasicPass"));
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true)
{
renderQueueRange = RenderQueueRange.opaque,
layerMask = 1 << LayerDefine.BG
};
context.DrawRenderers(cull.visibleRenderers, ref settings, filterSettings);
Shader側
SubShader{
Tags { "Queue"=“Geometry" "RenderType"=“Opaque"}
Pass{
Tags { "LightMode" = "BasicPass"}
....処理等
}
}

描画設定で指定したShaderPassNameと
ShaderのLightModeを一致させる必要が
あります。

39.

SRP㼪Ⰵ‫ח‬䔲‫ךג׏׋‬岣䠐挿

40.

SRP‫ך‬岣䠐挿΍ Camera‫؝ך‬٦ٕ‫ؙحغ‬禸‫כ‬ㄎ‫ׅת׶זֻז׸ׁ⳿ן‬կ ‫׭׋ך׉‬ծImageEffect禸‫ך‬㹋鄲‫׃׾‬湫‫ׅ‬䗳銲ָ֮‫ׅת׶‬կ public class MyScriptableRenderPipelineInstance : RenderPipeline{ // 描画のタイミングでコールバックされます public override void Render(ScriptableRenderContext context, Camera[] cameras){ base.Render(context, cameras); foreach (var camera in cameras){ // 描画処理をここに書いていきます } // ImageEffect等の実装はココで実行されるようにする等が必要です } }

41.

SRP‫ך‬岣䠐挿Ύ Surface Shader‫כ‬㼎䘔‫׿ׇתְג׃‬կ SRP‫כד‬ծvertex shader / fragment shader‫כֻ׃׮‬ծ 2018.1ַ‫ך׵‬倜堣腉ShaderGraph‫ךד‬Shader鎸鶢‫ח‬縧ֹ 䳔ִ‫׷‬䗳銲ָ֮‫ׅת׶‬կ

42.

Scriptable Render Pipeline‫׶״ח‬ծ 䲽歗‫ⵖך‬䖴‫דزفؙٔأ׾‬稢ַֻ⳿ 勻‫׋׃ת׶זחֲ״׷‬կ

43.

LightWeightRenderPipeline(LWRP)‫ך‬稱➜ ֿֿ‫דת‬SRP‫ך‬稱➜‫ָ׋׃תֹג׃׾‬ծ‫׾גץׅ‬0ַ‫׵‬鏣鎘٥圓眠‫ׅ‬ ‫כך׷‬侲㽿ָ넝ְ‫ׅד‬կ‫׭׋ך׉‬ծUnity⩎‫ד‬欽䠐‫ذ׋׃‬ٝ‫ٖف‬٦‫ز‬ ָ✳‫ׅת׶֮א‬կ ٥ٌ‫ٕ؎غ‬瘝‫ח‬ぢֽ‫׋‬鯪ꆀٖٝ‫ٔت‬ٝ‫؎ٓف؎ػؚ‬ٝ LightWeithRenderPipeline(LWRP) ٥‫ؒ؎ع‬ٝ‫חس‬暴⻉‫ٖ׋׃‬ٝ‫ٔت‬ٝ‫؎ٓف؎ػؚ‬ٝ HDRenderPipeline(HDRP)

44.

LightWeightRenderPipeline(LWRP)‫ך‬稱➜ Unity‫ך‬垥彊(Built-In)‫ך‬RenderPipeline‫׃הزحإـ؟ך‬ ‫ג‬⡲䧭ׁ‫׋׃ת׸‬կ ♧鿇堣腉‫׾‬䠐㔳涸‫ח‬ꤐ㢩‫׋׃‬䕎‫׶ֶג׏זה‬ծ‫ػⴓך׉‬ ‫ؓؿ‬٦‫و‬ٝ‫כأ‬垥彊‫׮׶״ך‬葺ְ‫ׅתְג׏זחך׮‬կ 垥彊‫ה‬LWRP‫ך‬堣腉嫰鯰‫♴כ‬鎸URL‫׶״‬ https://blogs.unity3d.com/jp/2018/02/21/the-lightweight-renderpipeline-optimizing-real-time-performance/

45.

LightWeightRenderPipeline(LWRP)‫ך‬稱➜ 標準のレンダリングパイプラインで問題だったポイントライトの加算問題も LWRPでは起こりません。ピクセルシェーダー側でキチンとポイントライトを 扱い1パスで描画されます

46.

LWRP‫ך‬㼪Ⰵ‫גְאח‬ • PackageManager‫《ד‬䖤‫׶《ג׃‬鴥‫׬‬ • ‫ٕـٓز‬㼰‫ֻז‬㼪Ⰵ‫ְ׋׃‬㜥さ‫ًأأָؔٓث؝כ‬ • githubַ‫ا׵‬٦‫《׾أ‬䖤‫ח♴زؙؑآٗفג׃‬ꂁ縧 • ؕ‫׾ؤ؎وةأ‬罋ִ‫׷ְג‬㜥さ‫ًأأָؔٓث؝כ‬ https://github.com/Unity-Technologies/ScriptableRenderPipeline

47.

PackageManagerַ‫׵‬LWRP‫ך‬㼪Ⰵ LightweightRenderPipelineをInstall するだけです

48.

LWRP‫ך‬㼪Ⰵ‫גְאח‬ • Shader‫׾‬LWRP㼎䘔‫חظٌך‬縧ֹ䳔ִ‫׷‬䗳銲ָ֮‫ת׶‬ ‫ׅ‬կ • Unity垥彊‫ך‬Shader‫׾‬⢪‫׷ְג׏‬Material‫כגְאח‬ ♧䭍縧䳔‫ך׭׋׷ׅ‬Editor䭁䓸ָず唓ׁ‫דך׷ְג׸‬ծ ֿ‫ⵃ׾׵׍‬欽‫ׅת׃‬կ

49.

LWRP‫ך‬㼪Ⰵ‫גְאח‬ • 荈魦‫ך‬Shader‫כגְאח‬ծLWRP‫ח‬㼎䘔‫׷ׅ‬䗳銲ָ֮ ‫ׅת׶‬ • 㛇劤‫כ‬LightMode‫׾‬չLightweightForwardպ‫ך׷ׅח‬ ‫ׅד׫‬ • ‫׃׌׋‬ShadowMapTexture‫ך‬䪔ְָ㢌‫דך׷ְג׏׻‬ծ Shadow‫׾‬䪔ֲ‫ךزؙؑآٗف‬㜥さ‫כ‬岣䠐ָ䗳銲‫ׅד‬ 参考URL https://connect.unity.com/p/lightweightrenderpipelinexiang-kenishaderwoshu-itemita

50.

LWRP‫ך‬岣䠐挿 • LightWeightRenderPipeline‫כ‬ծ♴鎸‫؛حػ‬٦‫פآ‬⣛㶷 ‫׭׋׷ְג׃‬ծ♴鎸‫؛حػ‬٦‫♧׮آ‬筰‫׷׸Ⰵח‬䗳銲ָ ֮‫ׅת׶‬ • PostProcessingStack v2 • ShaderGraph • Core RP

51.

‫➭ך׉‬稱➜ • [ShaderIncludePath]㾩䚍‫גְאח‬ • Stripping scriptable shader variants(2018.2։)‫גְאח‬ • SRP Batcher‫גְאח‬

52.

[ShaderIncludePath]㾩䚍‫גְאח‬ • Unity‫ך‬Shader‫ך‬include‫ٕך‬٦‫׾أػز‬醱侧䭷㹀‫׷ֹד‬ ‫׋׃ת׶זחֲ״‬կ • ֿ‫׶״ח׸‬չAssetsַ‫ך׵‬窫㼎‫׾أػ‬鿪䏝剅ֻպ or չ湱㼎‫أػ‬ ‫׾‬孡‫׵ָז׃ח‬剅ֻպ䗳銲ָ‫׋׃ת׶זֻז‬

53.

[ShaderIncludePath]㾩䚍‫גְאח‬ public class ShaderIncludePathSetting{ [ShaderIncludePath] public static string[] GetPaths(){ return new[]{ "Assets/SRP/Core/", "Assets/SRP/LightWeightPipeline/", }; } Shader内のincludeをコチラからの相対パスで } 指定できるようになります。

54.

[ShaderIncludePath]㾩䚍‫גְאח‬ • Githubַ‫׵‬ծLWRP‫׾‬㼪Ⰵ‫♴חֹה׋׃‬鎸‫חֲ״ך‬ Shaderؒٓ٦ָ㢳涪‫׷ׅ‬㜥さ‫כ‬չShaderIncludePathպ ‫ד‬姻‫ָأػְ׃‬䭷㹀ׁ‫ְזְג׸‬㜥さָ֮‫ׅת׶‬կ

55.

Stripping scriptable shader variants • Shader‫ך‬variants穈‫׫‬さ‫׶״חׇ׻‬ծShader荈⡤‫ך‬㺁 ꆀָ花‫㉏ֲת׃ד׿׵‬겗ָ֮‫׋׃ת׶‬ • ٓٝ‫⟃ؤ؎؟ي؎ة‬㢩‫سٕؽ׮ח‬儗꟦‫׮ח‬䝤䕦갟ָ ֮‫׋׃ת׶‬ • ֿ‫ח׸‬㼎䘔‫׭׋׷ׅ‬ծِ٦‫ؠ‬٦⩎‫ⵃד‬欽‫ְז׃‬穈‫׫‬ さ‫דأإٗفسٕؽ׾ׇ׻‬ꤐ㢩‫ת׶זחֲ״׷ֹד‬ ‫ׅ‬ 参考URL https://blogs.unity3d.com/2018/05/14/stripping-scriptable-shader-variants/

56.

Stripping scriptable shader variants‫ה‬ LWRP‫ך‬ꟼ⤘‫גְאח‬ • LWRP‫غך‬٦‫ّآ‬ٝ 2.0 ⟃꣬‫כד‬ծ Stripping scriptable shader variants‫ךפ‬㼎䘔‫׾‬遤ְ‫ת‬ ‫׋׃‬կ • ‫׭׋ך׉‬ծLWRP 2.x 禸‫ כ‬Unity2018.1‫ⵃכד‬欽ָ⳿勻‫׿ׇת‬ • ‫➭ך׉‬LWRP 2.0禸‫؎ًכד‬ٝ‫ך‬Renderpipeline‫Ⳣח‬椚‫׾‬꧊⚥ׁ ‫ח׆ׇ‬ծٌ‫ُآ‬٦ٕ⻉‫׾‬遤ְ‫׋׃ת‬

57.

SRP Batcher‫גְאח‬ • 䲽歗‫ח‬䱦ַ‫׷‬CPU頾蚚‫׾‬幾‫➬ך׭׋ׅ׵‬穈‫ׅד׫‬ • ずׄShader‫ⴽ׮ד‬ղ‫ٔذوך‬،ٕ‫ٖד‬ٝ‫ٔت‬ٝ‫׷ְג׃ؚ‬朐屣 ‫ד‬剣⸬‫ׅתֹ⫴ח‬ • GPU⩎‫ך‬頾蚚‫כ‬㢌‫׿ׇת׶׻‬ • 㜥さ‫כג׏״ח‬5⦓‫וק‬傍ֻ‫ׅת׶ז‬ • 植㖈‫ כ‬DirectX11/Metal橆㞮♴‫׫ך‬Experimental‫ְֲה‬䕎‫ד‬㼎䘔կ 2018.3‫כד‬Vulkan‫׾‬Experimental‫ג׃ה‬鷄⸇✮㹀

58.

SRP Batcher‫ⵃך‬欽倯岀 GraphicsSettings.useScriptableRenderPipelineBatching = true; ֿ‫׾׸‬ㄎ‫ׅדֽ׌ׅ⳿ן‬կ ※LWRP/HDRP‫ כֻ׃׮‬Unity‫ך‬寸‫؎ٖ׋׭‬،ؐ‫דز‬CBuffer‫׾‬㹀纏 ‫׷ְג׃‬䗳銲ָ֮‫ׅת׶‬

59.

SRP Batcher‫ך‬鑫稢 ‫ך׸׊׸׉‬DrawCall‫ח⵸ך‬遤‫׷׸׻‬CPU⩎‫ד‬遤‫׷׸׻‬ չGPU‫زحإ‬،‫Ⳣفح‬椚պ‫׾‬鸞ֻ‫ׅתְג׃‬կ Material嫣‫ך‬ConstantBuffer‫ך‬䪔ְ‫׾‬㢌ִ‫ד✲׷‬ծ Materialⴖ‫׶‬剏ִ‫ח‬䱦ַ‫׷‬CPU‫ׅתְג־♴׾زأ؝‬

60.

SRP Batcher‫ך‬鑫稢(RenderDoc䊴ⴓ嫰鯰) SRP Batcher有効時 SRP Batcher無効時

61.

SRP Batcher‫ך‬鑫稢(RenderDoc䊴ⴓ嫰鯰) ドローコール数や順番はSRP Batcherの有無で は変わっていません。 SRP Batcher有効時 SRP Batcher無効時

62.

SRP Batcher‫ך‬鑫稢(RenderDoc䊴ⴓ嫰鯰) 実際に描画する前に行うShaderパラメーター のセット周りの処理が異なっています SRP Batcher有効時 SRP Batcher無効時

63.

‫؛‬٦‫؍رةأأ‬ • 0ַ‫׵‬杝荈‫ך‬RenderPipeline荈⡲‫׋׃‬鑧 • LWRP‫ك׾‬٦‫חأ‬RenderPipeline‫׋׃يةأؕ׾‬鑧

64.

0ַ‫׵‬杝荈‫ך‬RenderPipeline‫׾‬荈⡲‫׋׃‬鑧

65.

匢‫؞ٔه‬ٝ‫ד‬䲽歗‫ֽ׌׷ְג׃‬ キャラクターは板ポリゴンに スプライトを貼っただけ

66.

鸐䌢‫ך‬RenderPipeline‫…כד‬

67.

鸐䌢‫ך‬RenderPipeline‫…כד‬ Transparentは奥から手前を 遵守します

68.

鸐䌢‫ך‬RenderPipeline‫…כד‬ Materialの切り替えを都度しな がら奥から手前へ描画します

69.

鸐䌢‫ך‬RenderPipeline‫…כד‬ そのため、描画するのに非常に多くの Material切り替えが発生しました

70.

Materialⴖ‫׶‬剏ִ䫇ִ‫…ְ׋‬ չ㤴ַ‫׵‬䩛⵸պ ֿ‫ٕך‬٦ٕ⡦‫…ְ׋׃ַה‬

71.

Scriptable Render Pipeline‫׵ז‬ չ㤴ַ‫׵‬䩛⵸պٕ٦ٕ‫׮‬㢌刿 ‫ׅתֹד‬

72.
[beta]
䲽歗‫ךֹה׷ׅ‬鏣㹀‫…ד‬
var pass = new ShaderPassName("BasicPass");
var settings = new DrawRendererSettings(camera, pass);
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true){
renderQueueRange = RenderQueueRange.transparent,
layerMask = 1 << LayerDefine.BG
};
context.DrawRenderers(cull.visibleRenderers,
ref settings,
filterSettings);

73.
[beta]
䲽歗‫ךֹה׷ׅ‬鏣㹀‫…ד‬
var pass = new ShaderPassName("BasicPass");
var settings = new DrawRendererSettings(camera, pass);
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true){
renderQueueRange = RenderQueueRange.transparent,
layerMask = 1 <<描画する時のShaderのPass名
LayerDefine.BG
};
を指定できます
context.DrawRenderers(cull.visibleRenderers,
ref settings,
filterSettings);

74.
[beta]
䲽歗‫ךֹה׷ׅ‬鏣㹀‫…ד‬
var pass = new ShaderPassName("BasicPass");
var settings = new DrawRendererSettings(camera, pass);
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true){
renderQueueRange = RenderQueueRange.transparent,
layerMask = 1 << LayerDefine.BG
描画する時のソート順を指
};
context.DrawRenderers(cull.visibleRenderers,
定できます
ref settings,
filterSettings);

75.
[beta]
䲽歗‫ךֹה׷ׅ‬鏣㹀‫…ד‬
var pass = new ShaderPassName("BasicPass");
var settings = new DrawRendererSettings(camera, pass);
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true){
renderQueueRange = RenderQueueRange.transparent,
layerMask = 1 << LayerDefine.BG
};
描画する対象のオブジェクトの
context.DrawRenderers(cull.visibleRenderers,
ref settings,
Opaque・Transparent等を指定
filterSettings);
できます。

76.
[beta]
䲽歗‫ךֹה׷ׅ‬鏣㹀‫…ד‬
var pass = new ShaderPassName("BasicPass");
var settings = new DrawRendererSettings(camera, pass);
settings.sorting.flags = SortFlags.CommonOpaque;
var filterSettings = new FilterRenderersSettings(true){
renderQueueRange = RenderQueueRange.transparent,
layerMask = 1 << LayerDefine.BG
};
context.DrawRenderers(cull.visibleRenderers,
ref settings,
Layer単位で描画するオブジェクト
filterSettings);
を切り替えられます。

77.

֮‫ ה‬Shader‫ ח‬Z Pre-Pass‫׾‬ ➬鴥‫ׅתֶֹד׿‬

78.

SubShader{ Tags { "Queue"="Transparent" "RenderType"="Transparent"} // Z Pre-Pass Pass{ Tags { "LightMode" = "ZPrepass"} ZWrite On ColorMask 0 //...実際の処理 } // 実際の描画用のパス Pass{ Tags { "LightMode" = "BasicPass"} ZWrite Off ZTest Equal Blend SrcAlpha OneMinusSrcAlpha //...実際の処理 } }

79.

‫ַ׋׏׻‪ֲ㢌‬וד‪SRP‬‬ ‫ֲ׳׃תֹ׌׋ְג‪鋅‬‬

80.

⯓‫ ח‬Depth⦼‫ֽ׌‬剅ֹ鴥‫ׅת׫‬ αが一定値以下の場合はdiscard して描画を行うShader Pass 「ZPrepass」で一旦キャラク ターを描画します。 ※Z Bufferの様子です

81.

‫ך׉‬䖓䎮‫׾‬䲽ֹ‫ׅת‬ その後 床を描画します

82.

‫ך׉‬䖓‫ةٍؙٓؗ‬٦‫׾‬䲽ֹ‫ׅת‬ キャラクターを通常のShaderPassで描画します。 この時、マテリアル切り替えを最小に抑える順番になるように sorting.flagに「SortFlags.OptimizeStateChanges」を指定します

83.

‫ך׉‬䖓‫ةٍؙٓؗ‬٦‫׾‬䲽ֹ‫ׅת‬ 最後に影を描画します

84.

Z Pre-Pass‫׾‬㼪Ⰵ‫דך׋׃‬ծ ‫ך׉‬䖓‫ך‬䲽歗儗‫ח‬չ㤴ַ‫׵‬䩛⵸պ ‫׾‬黼㸚‫׮גֻז׃‬窩ָ灶笼‫ְז׃‬ ※α‫⼱ךד‬鷲僇ָ‫⵸ְז‬䲿‫…ׅד‬

85.

⡦‫اד‬٦‫ز‬黝䔲‫׮ד‬窩ָ灶笼‫ַךְז׃‬ Z BufferのZ値と一致した部分のピクセルでない と、Zテストを通らず、ピクセルが塗られないた め絵が破綻しません

86.

穠卓 Materialⴖ‫׶‬剏ִָ幾‫׶‬ 䲽歗頾蚚ָ慧幾‫׋׃ת׃‬

87.

LWRP‫ك׾‬٦‫׋׃يةأؕחأ‬鑧 背景からキャラクター。 キャラクターから背景への影 はリアルタイムShadowで、他 は焼いたShadowです。

88.

LWRP‫ك׾‬٦‫׋׃يةأؕחأ‬鑧 わかりやすくするため、 リアルタイムのShadowのみ青 くしました。

89.

‫…׶תא‬ ‫‪ⵃ欽‬׾‪Shadow‬׋ְ‪搶‬ח⵸✲‪Ӎ‬‬ ‫زؙؑآـؔ‪ → 胜兝‬زؙؑآـؔ‪胜兝‬‬ ‫‪Shadow‬ךي؎ةٕ‪Ӎٔ،‬‬ ‫‪٦‬ةٍؙٓؗ → زؙؑآـؔ‪胜兝‬‬ ‫زؙؑآـؔ‪٦ → 胜兝‬ةٍؙٓؗ‬ ‫‪٦‬ةٍؙٓؗ → ‪٦‬ةٍؙٓؗ‬

90.

LWRP‫…ה׌תתך׉‬ 焼いたShadowの上からリアル タイムのShadowも描いてしま います

91.

LWRP‫…ה׌תתך׉‬ それを防ごうとすると、 キャラクターへのShadowが なくなってしまいます

92.

‫‪‬ךְ׋׃✲ז׿׉‪⡦佦ծ‬‬ ‫‪䲽‬ך‪䕦荈⡤‬ג׃ח‪Shadow‬ي؎ةٕ‪ٔ،‬׾ֽ׌׶‪ワ‬ך‪٦‬ةٍؙٓؗ •‬ ‫ׅד‪،‬؍ر؎‪ְֲ،‬הֲ״ִ‪䫇‬׃‪㼰‬׾‪歗頾蚚‬‬ ‫׷׸׵ִ‪䫇‬׮‪鍑⫷䏝‬ך‪Shadow‬דך׬‪幥‬ד׫ך׶‪٦ワ‬ةٍؙٓؗ •‬ ‫׷ג⥂׾‪넝ㅷ颵‬דךז‪䕦‬׋ְ‪搶‬ח⵸✲כ‪䕦‬ך‪• 胜兝‬‬

93.

ؕ‫גְאחأػ׋׃ؤ؎وةأ‬΍ 始めにキャラクターだけの ShadowMapを生成します

94.

ؕ‫גְאחأػ׋׃ؤ؎وةأ‬Ύ キャラクターだけのShadowMapを 適応して背景を描きます

95.

ؕ‫גְאחأػ׋׃ؤ؎وةأ‬Ώ キャラクターだけのShadowMapに 背景オブジェクトも描き足します。

96.

ؕ‫גְאחأػ׋׃ؤ؎وةأ‬ΐ 最後にキャラクターを描画します。

97.

ׂ‫Ⳣך׶ֻ׏‬椚崧‫׸‬ // 描画時にコールバックされます。引数contextに対して描画命令を発行していきます void OnRender(ScriptableRenderContext context, Camera[] cameras) { foreach (var camera in cameras){ // 「Chara」レイヤーだけ先にShadowを処理します ShadowPass( 1 << Layers.Chara); // 「Chara」レイヤー以外のオブジェクトをレンダリングします DrawObjects( ~( 1<< Layers.Chara) ); // 「Chara」レイヤー以外のShadowを処理します ShadowPass( ~( 1 << Layers.Chara) ); // 「Chara」レイヤーのオブジェクトだけをレンダリングします DrawObjects( 1<< Layers.Chara ); } }

98.

‫ ➭ך׉‬䘔欽⢽ 通常では、SelfShadowが発 今回の特殊パスを用いれば、 生してしまいます キャラクターのSelfShadowのみオフ に出来ます

99.

SRP‫ך‬涫㜥‫׶״ח‬ծShadow Pass‫׾‬ 荈歋‫ⵖח‬䖴⳿勻‫ך׋׏זחֲ״׷‬ ‫ד‬ծ倜‫ְ׃‬邌植‫׮‬〳腉‫ח‬

100.

‫׭הת‪ScriptableRenderPipeline‬‬ ‫ַزؙؑآٗفך‪ծ傀㶷‬דךׅת׶זֻז‪侭さ䚍‬ךה‪项欵‬ך⿠‪• 麓‬‬ ‫‪կ‬ׅתְ‪⠵‬׾⸤‪蕱‬כִ‪䳔‬׶⛦ך׵‬ ‫‪،‬ؽء׾׶‪ծ䲽歗ワ‬דך׋׃ת׶זחֲ״׷‪稢ַֻⵖ䖴⳿勻‬׌׋ •‬ ‫‪կ‬ׅת׶ָ֮⦼‪⣣‬׷ׅⰅ‪㼪‬כדزؙؑآٗفְ׋׶‪䒚‬ח‬ ‫‪ծ嫰鯰‬כדي‪٦‬؜ְזך‪Shadowָ䗳銲‬ي؎ةٕ‪ٔ،‬װ‪ⵖ䖴‬ز؎ٓ •‬ ‫‪կ‬ׅתְ‪䙼‬הְַׅװ׃Ⰵ‪㼪‬דךׅת‪㹋鄲⳿勻‬חٕف‪ٝ‬ء‪涸‬‬ ‫‪崢欰‬׵ַأ‪٦‬اך‪LWRP‬׷ְג׃‪䲿⣘‬ך‪ծUnity‬כ‪ְ㜥さ‬זדֲ׉ •‬ ‫ֲ׳׃דְ‪ָ葺‬ך׷ׅ‪㹋鄲‬ד‪䕎‬׷ׅ‬

101.

‫‪ّٝ‬ءحإֲ‪遤‬ח‪ծ⼯䖓‬װأ‪٦‬ـ‪䒦爡‬‬ ‫‪堣腉պ‬ךא‪ְ3‬׃‪倜‬ך׭׋ַׅ‪崞‬׾‪䚍腉‬ך‪ؐؑ،‬س‪٦‬ع‪չ‬‬ ‫‪ְׁկ‬׌ֻ׃‪僽ꬊֶ馉‬׮ח‬

102.

Appendix 0ַ‫׵‬⡲䧭‫؎ٓف؎ػ׋׃‬ٝ‫؟ך‬ٝ‫ٕف‬ https://github.com/wotakuro/CustomScriptRenderPipelineTest LWRP‫׾‬何鸡‫؟׋׃‬ٝ‫ٕف‬ https://github.com/wotakuro/MixedShadowSample SRP‫ך‬䒚‫׋׏‬儗‫ח‬饯ֹ‫׾וזהֿ׋‬鎸✲‫ׅתְג׃ח‬ https://connect.unity.com/u/5768a3b332b306001aaf2d1f