本日はShader学習枠です。
〇GrabPassとは?
GrabPassはUnity内でのShaderですでにレンダリングした画像を使用することができます。
これを用いることで一度描画したカメラの映像にエフェクトを加えることなどできます。
以前ShaderGraphでBlur表現を行いました。これにもShader内で一度レンダリングした画像を使用し処理をしていました。
これをShaderLabで使用する際にGrabPassを用います。
GrabPassを用いて、sampler2D GrabTexture;を定義することでGrabTextureとしてレンダリング済みのカメラの映像を使用できます。
〇URPでのGrabPass
URPおよびHDRPではGrabPassは廃止され使用することができません。
これはURPおよびHDRPのスクリプタブルレンダーパイプライン(SRP)がカメラコンポーネントなどレンダリングにかかわる機能が変わっており、定義が変わっているためと思われます。
ShaderGraphでは[scene color]ノードで取得することができます。
URPプロジェクトでGrabPass{}を含むシェーダーを実行すると次のようにエラーが表示されます。
今回はURPプロジェクト内でGrabPassを使用します。
〇URP Grab Pass
URP Grab PassはHaruma-Kさんが公開しているURPプロジェクトでGrab Passを使用することができるようになるGitHubプロジェクトです。
今回は筆者のプロジェクトにURP Grab Passを導入しShaderで使用します。
①PackageManagerを開きます。上部ワールドメニューから[+]アイコン→[Add Package from git url]を選択します。
②いかのURLを打ち込み[Add]を選択します。
https://github.com/Haruma-K/URPGrabPass.git?path=/Assets/URPGrabPass
これによって自身のプロジェクトにURP Grab Passが導入されます。
③UnityのGraphicsSettingsから使用しているURPSettingsを開き、ForwardRendererを開きます。
④[Add Renderer Feature]を選択し[GrabPass Renderer Feature]を選択します。
これによってGrabPassの機能が追加されました。
〇Shader側の実装
今回はプリミティブのUnlitShaderに一行追加しました。
Shader "Unlit/GrabShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } sampler2D _GrabbedTexture;//////////追加 fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_GrabbedTexture, i.uv);//_GrabbedTextureに変更 // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
このShaderをCubeにアタッチすることでカメラの映像をキューブに張り付けて使用することができました。
今回は以上です。次回以降で詳しく使い方等を見ていきます。