Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

Unityによって予約されているTextureについて

概要

Unityにはいくつかの特別なテクスチャがあり、これらのテクスチャは特定の目的のために予約されている。
つまり、シェーダー内で同じ名前のテクスチャを独自に宣言して使用することは推奨されない。
とくにURPやHDRPのようなSRPでsahderを作成する際に気になるポイントかと思われる。
これらのテクスチャについて調べたので、おそらく他にもあるだろうがまとめておく。

URPのLit Shader

具体例として、URPのLit Shaderで用いられているpropertiesを抜粋する。

Properties
    {
        // Specular vs Metallic workflow
        _WorkflowMode("WorkflowMode", Float) = 1.0

        _WaterHeight("WaterHeight", Float) = 0.55
        _HeightScale("HeightScale", Float) = 1.0

        [MainTexture] _BaseMap("Albedo", 2D) = "white" {}
        [MainColor] _BaseColor("Color", Color) = (1,1,1,1)

        _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
        _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0

        _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
        _MetallicGlossMap("Metallic", 2D) = "white" {}

        _SpecColor("Specular", Color) = (0.2, 0.2, 0.2)
        _SpecGlossMap("Specular", 2D) = "white" {}

        [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
        [ToggleOff] _EnvironmentReflections("Environment Reflections", Float) = 1.0

        _BumpScale("Scale", Float) = 1.0
        _BumpMap("Normal Map", 2D) = "bump" {}

        _Parallax("Scale", Range(0.005, 0.08)) = 0.005
        _ParallaxMap("Height Map", 2D) = "black" {}

        _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
        _OcclusionMap("Occlusion", 2D) = "white" {}

        [HDR] _EmissionColor("Color", Color) = (0,0,0)
        _EmissionMap("Emission", 2D) = "white" {}

        _DetailMask("Detail Mask", 2D) = "white" {}
        _DetailAlbedoMapScale("Scale", Range(0.0, 2.0)) = 1.0
        _DetailAlbedoMap("Detail Albedo x2", 2D) = "linearGrey" {}
        _DetailNormalMapScale("Scale", Range(0.0, 2.0)) = 1.0
        [Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}

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

        // Blending state
        _Surface("__surface", Float) = 0.0
        _Blend("__blend", Float) = 0.0
        _Cull("__cull", Float) = 2.0
        [ToggleUI] _AlphaClip("__clip", Float) = 0.0
        [HideInInspector] _SrcBlend("__src", Float) = 1.0
        [HideInInspector] _DstBlend("__dst", Float) = 0.0
        [HideInInspector] _ZWrite("__zw", Float) = 1.0

        [ToggleUI] _ReceiveShadows("Receive Shadows", Float) = 1.0
        // Editmode props
        _QueueOffset("Queue offset", Float) = 0.0

        // ObsoleteProperties
        [HideInInspector] _MainTex("BaseMap", 2D) = "white" {}
        [HideInInspector] _Color("Base Color", Color) = (1, 1, 1, 1)
        [HideInInspector] _GlossMapScale("Smoothness", Float) = 0.0
        [HideInInspector] _Glossiness("Smoothness", Float) = 0.0
        [HideInInspector] _GlossyReflections("EnvironmentReflections", Float) = 0.0

        [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
        [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
        [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
    }

プロパティのオプションについて

プロパティの前に[]を指定して、オプションをつけることができる。
オプションについての公式マニュアルは以下。
ShaderLab: Properties - Unity マニュアル
例えば[MainTexture]があるが、これを指定すると、通常Unityは_MainTexがメインテクスチャであるとして内部で処理しているが、[MainTexture]が指定されたテクスチャをMainTextureであるとしてshaderの処理を実行する。
LitShaderでは_BaseMapがメインテクスチャとして扱われている。

予約されているTexture変数

_MainTex

上にも少し書いたとおりであるが、マテリアルにつけられるメインのテクスチャのことを指している。
[MainTexture]がオプションで付けられていない限り、デフォルトでUnityは_MainTexがメインテクスチャであるとして処理する。

_CameraOpaqueTexture

不透明なオブジェクトのレンダリング結果を格納するために使用される。
FrameDebugを見ると描画している処理順が見れるが、DrawOpaqueObjectsの処理が終わった後に、RendererのOpaqueで指定されているObjectsの描画結果がこのテクスチャに格納される。
Transparentsの処理でblendなどしたい場合、利用できる。

_CameraDepthTexture

カメラの深度情報を表すテクスチャで、デプステストやシャドウマップの生成など、深度に関連する処理を行う際に利用できる。

予約されているわけではないが、一般的に使用されているTexture変数

_BumpMap

Normal Mapとして一般的に使用されている名前。
カスタムする傾向にないビルトインパイプラインでは、この名前をそのまま使用した方がよいかも。

_SpecularMap

Specular Mapとして一般的に使用されている名前。
物体の反射ハイライトの制御に使用される。
ChatGPT先生に聞いてみると

要約すると、Unityのビルトインシェーダーでは_SpecularMapという変数名が一般的に使用されますが、カスタムシェーダーを作成する場合は自由に変数名を選択できます。ただし、シェーダーマテリアルのテクスチャスロットに関連付ける際には、スロットの名前を _SpecularMap として指定する必要があります。

とのことだが、スロットの名前というのが不明。
Unity内部で予約されているわけでなないので、Specular Mapという名前でなくてもよいはず。
開発者以外が使用することを想定して、inspectorに出てくる名前の部分を"Specular Map"にしなさい、ということかもしれない。

_EmissionMap

物体の発光や自己発光を制御するために使用されるが、上記同様_EmissonMapという名前が推奨されるが、この名前でなくともよい。