ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【Unity】環境マッピング (キューブマッピング)

環境マッピングとは

環境マッピングはオブジェクトに背景が映り込ませる技術です。 f:id:Ny_Program:20210726092734p:plain

環境マップという背景を映した特殊なテクスチャをキューブ上に並べ、オブジェクトの反射ベクトルの先にある環境マップの色を描画します。

https://i2.wp.com/blog.applibot.co.jp/wp-content/uploads/2017/11/3da797de-a9e4-a450-052e-1e5fa071b140.png 【連載】Unity時代の3D入門 – 第7回「キューブマッピング」 – てっくぼっと!引用

実装

Shader "Custom/Cubemapping"
{
    Properties {
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata {
                float4 vertex: POSITION;
                half3 normal: NORMAL;
                half2 uv: TEXCOORD0;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                half2 uv : TEXCOORD0;
                float3 pos2 : TEXCOORD1;
                half3 normal : TEXCOORD2;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.pos2 = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.normal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                i.normal = normalize(i.normal);
                // 視点ベクトル
                half3 viewDir = UnityWorldSpaceViewDir(i.pos2);
                // 視点ベクトルと法線から反射ベクトルを取得
                half3 reflDir = reflect(-viewDir, i.normal);
                // キューブマップと反射ベクトルから反射先の色を取得
                half4 refColor = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflDir);
                return half4(refColor.rgb, 1);
            }
            ENDCG
        }
    }
}

// キューブマップと反射ベクトルから反射先の色を取得
                half4 refColor = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflDir);

unity_SpecCube0は現在使用されているキューブマップです。 UNITY_SAMPLE_TEXCUBEにキューブマップと反射ベクトルを渡すことで、反射先のキューブマップの色を取得できます。