URPで書いてみる - saitocastel1900/UnityShader GitHub Wiki

  • BuildInとURPではShaderの書き方が変わるので、まずはテクスチャマッピングでURPを試す

  • 実行環境のレンダリングパイプラインを指定(ここではURPを指定)。実はなくても動くらしい

 Tags {
            "RenderType"="Opaque"
            "RenderPipeline" = "UniversalRenderPipeline"
        }
  • URPだと言語はCGからHLSLになるので、CGPROGRAM→HLSLPROGRAMにする
HLSLPROGRAM
  • インクルードして、便利な関数をつかえるようにする。BuildInだと「#include "UnityCG.cginc"」だった
 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  • ここが結構変わった箇所で、どうやらSRP Batcherという機能を扱うために色々する必要があるみたい。SRP Batcherとは、今までCPUで描画処理を呼び出していたので、シェーダー単位で呼び出せるようにできるみたい。対応させるためには、 CBUFFER_START(UnityPerMaterial) ~CBUFFER_ENDに外部プロパティを定義する必要がある
TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex); 
            float4 _Color;

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            CBUFFER_END
  • あとはクリッピング空間への変換関数が変わりました。前は、「UnityObjectToClipPos(v.vertex);」
TransformObjectToHClip(v.vertex);
  • サンプラーとかの定義もマクロでする必要があるみたいです。あとサンプリングもマクロを使う感じです
 TEXTURE2D(_MainTex);
 SAMPLER(sampler_MainTex); 

SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);
Shader "Unlit/URPSimpleTextureUnlitShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags {
            "RenderType"="Opaque"
            "RenderPipeline" = "UniversalRenderPipeline"
        }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex); 
            float4 _Color;

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            CBUFFER_END
            
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

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

            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
            {
               float4 col = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);
                return col * _Color;
            }
            ENDHLSL
        }
    }
}