C++幼女先輩

プログラミング成分多め

URPの勉強をする。概要

趣旨

Unityが従来の固定レンダリングパイプライン(BuiltIn RP)の後継にURPを指名した
ので、早急にURPを調査する必要がある

blogs.unity3d.com

UNITYのレンダリングパイプライン

SRP

UNITYのレンダリングは下記のようなパイプラインで行われる

それらのパイプラインは、UNITYエンジンでハードコーディングされており、BuiltIn RPと呼ばれる
UNITY2018より、PreviewとしてScriptable Render Pipeline(SRP)がテスト実装された
SRPでは、レンダリングパイプラインをプログラマが自由に変更できるようになった

blogs.unity3d.com

LWRP, HDRP, URP

レンダリングパイプラインを変更すると、シェーダーも全部作り直す必要があり
非常にコストが高いため
ある程度汎用的な2つのパイプラインをUNITY社は用意をした

ハイクオリティーレンダリング用途のHDRP(High Definition Render Pipeline)と
低スペック端末用のLWRP(Light Wait Render Pipeline)

そして、従来LWRPと呼んでいたものを、UNITY2020からURP(Universal Render Pipeline)と改名し
BuiltIn RPの後継に指名した

note.com

コードリポジトリ

BuiltIn Shaderのコードリポジトリは見つけられなかったが、下記でバージョンごとにダウンロードできる ダウンロードタブを押すと、ビルトインシェーダーを選択できる
unity3d.com

レンダーパイプラインはリポジトリが公開されているので、対象のバージョンをTagで指定してダウンロードできる
github.com

使っているUNITYのRenderPipelineのバージョンを調べるには、UnityPackageManagerでRP等で検索してバージョンを調べる
例えば、Unity2020.2.1 だと、v10.2.2である
f:id:murasame-labo:20210120031600p:plain

シェーダーの書き方

UNITYのシェーダーはHLSLベースの、ShaderLabという言語で書く
テキストエディタで作る
シェーダーのフル機能を使う事が出来る
私の知る限りだが、ビジュアルスクリプティングでは一部の表現が出来ない

ビジュアルスクリプティング

以前より優良アセットとして、ShaderForge、Amplify Shader Editorがある(あった)
ShaderForgeは開発中止されたが、Amplifyは今でも使われていて、URPにも対応しているらしい
UNITY社はShaderGraphを無料で提供し、当然URPにも対応している
一部出来ないことはあるかもしれないが、ノードベースでシェーダーを書きたい人の選択肢になればと

URP プロジェクトを作ってみる

プロジェクトの作成は簡単
UnityHubで新規プロジェクト作成時にURPプロジェクトのテンプレートがあるので作成する

f:id:murasame-labo:20210120050056p:plain

そこに、仮に独自シェーダーのモデルをImportすると

f:id:murasame-labo:20210120045304p:plain
ShaderError

URPに対応していないシェーダーなのか、シェーダーエラーになる

仮に、URP/Unlitシェーダーを適用すれば、テクスチャがはられたのみのモデルが表示される

f:id:murasame-labo:20210120045024p:plain
URP/Unlit

URP/Unlitシェーダーを覗く

github.com

チラ見で気になるのが、SRP batching
軽くみたかんじ、BuiltIn RPでは同じマテリアルでしかBatchingが出来なかったが
SRP(URP)では、異なるマテリアルであっても、シェーダーが同じであればInstancing出来るようだ
そのため、他のシェーダーとも共通化してあるのかな

        // SRP batching compatibility for Clear Coat (Not used in Lit)
        [HideInInspector] _ClearCoatMask("_ClearCoatMask", Float) = 0.0
        [HideInInspector] _ClearCoatSmoothness("_ClearCoatSmoothness", Float) = 0.0

URPには、 "RenderPipeline" = "UniversalPipeline" Tagが必要そう

独自のシェーダーパスも簡単に作れそうだ
qiita.com

今度は簡単なURP対応シェーダーを作ろうと思う