Version: Unity 6.0 (6000.0)
言語 : 日本語
ビルトインレンダーパイプラインでの法線マップテクスチャシェーダーの例
ビルトインレンダーパイプラインにおける単純なディフューズライティングシェーダーの例

ビルトインレンダーパイプラインでの 3 平面テクスチャシェーダーの例

複雑なメッシュやプロシージャルなメッシュでは、通常の UV 座標を使用したテクスチャリングの代わりに、主要な 3 方向からオブジェクトに “project” テクスチャを設定する方が有効な場合があります。これは “tri-planar” (3 平面) テクスチャ法と呼ばれます。面の法線を 3 方向からのテクスチャの重み付けに使うという考え方です。これが、シェーダーです。

Shader "Unlit/Triplanar"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Tiling ("Tiling", Float) = 1.0
        _OcclusionMap("Occlusion", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                half3 objNormal : TEXCOORD0;
                float3 coords : TEXCOORD1;
                float2 uv : TEXCOORD2;
                float4 pos : SV_POSITION;
            };

            float _Tiling;

            v2f vert (float4 pos : POSITION, float3 normal : NORMAL, float2 uv : TEXCOORD0)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(pos);
                o.coords = pos.xyz * _Tiling;
                o.objNormal = normal;
                o.uv = uv;
                return o;
            }

            sampler2D _MainTex;
            sampler2D _OcclusionMap;
            
            fixed4 frag (v2f i) : SV_Target
            {
                // use absolute value of normal as texture weights
                half3 blend = abs(i.objNormal);
                // make sure the weights sum up to 1 (divide by sum of x+y+z)
                blend /= dot(blend,1.0);
                // read the three texture projections, for x,y,z axes
                fixed4 cx = tex2D(_MainTex, i.coords.yz);
                fixed4 cy = tex2D(_MainTex, i.coords.xz);
                fixed4 cz = tex2D(_MainTex, i.coords.xy);
                // blend the textures based on weights
                fixed4 c = cx * blend.x + cy * blend.y + cz * blend.z;
                // modulate by regular occlusion map
                c *= tex2D(_OcclusionMap, i.uv);
                return c;
            }
            ENDCG
        }
    }
}
ビルトインレンダーパイプラインでの法線マップテクスチャシェーダーの例
ビルトインレンダーパイプラインにおける単純なディフューズライティングシェーダーの例