HDRPでカスタムShader - Unlit編

概要

HDRPはUnityが提供しているレンダーパイプラインの1つです。PBRや写実性が高いものを描画するのに長けている印象で、URPと同じくSRPの上に構築されたレンダーパイプラインの一つです。

しかし、URPと比較するとHDRPに関する記事は多いわけではなく内部のスクリプトも複雑になっているため敷居がたかいイメージがあります。

HDRPはShaderGraphを使用することや、HDRPに入っている標準のポストエフェクト等を使用することを目指して作られているような所感を受けましたが、元々作っているものをHDRPに移植したい時やHLSLを書いて表現を構築したい場合はあります。

本記事やこのブログで、HDRPにおいてカスタムシェーダーを作りたい方の少しでも助けになればと思います。

HDRPでカスタムUnlitシェーダーを書く

本記事では最低要素のUnlitシェーダーを書いてみます。

筆者の環境は

  • Unity2022.3.4f1
  • HDRP 14.08

になります。

Unity設定

まず、前提として今回はHDRPのRenderingのLitShaderModeを「Forward Only」に変更します。

以下のようにProjectSettingsからRenderingタブから変更してください。

Deferred Onlyの場合やBothの設定の場合はまた別の記事で書いてみようと思います。

Shader

ではUnlitShader全文です。

Shader "Custom/SampleUnLit"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags 
        {
            "RenderType"="Opaque"
            "RenderPipeline"="HDRenderPipeline"
        }
        LOD 100

        Pass
        {
            Tags {"LightMode" = "Forward"}
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
            #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            CBUFFER_END

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
            }
            ENDHLSL
        }
    }
}

解説

基本はURPで行うUnlitと同じ処理になります。ただ、HDRPでのincludeやTag指定は気を付けないと描画されません。

include

includeは基本的にこの2つかと思います。影の描画を行う場合は別のincludeが必要ですが、この2つがカスタムシェーダーを書く際のUnityが用意している関数やGlobal変数などを保持しています。

#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"

Tags

Tag指定は以下のように行っています。もちろんRenderTypeはその時に応じて変更しますが、RenderPipelineはHDRenderPipelineを指定します。

Tags 
{
    "RenderType"="Opaque"
    "RenderPipeline"="HDRenderPipeline"
}

描画結果

上記のShaderをもとにMaterialを作成し、Cubeにアタッチすると以下のように描画されます。

最後に

これで最低要素のUnlitShaderを記述できました。これをもとにお好みのカスタマイズを行えます。

次はLitShader、特に影を落とす・他の影を受ける。というところを詳細に書こうと思います。

参考

docs.unity3d.com

tips.hecomi.com