うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Fog について

Fog とは、カメラからの距離に応じてオブジェクトに色を重ねるエフェクトです

例えば青のFogを適応した場合右画像のようになります

f:id:hacchi_man:20201016003536p:plain:h300f:id:hacchi_man:20201016003521p:plain:h300

これは Shader 側で行われている処理で Shader が Fog に対応していなければ適応されません

Shader

Vertex Shader

pragma に multi_compile_fog を定義して

struct, vert, frag に適応する処理を追加する必要があります

Shader "Unlit/Shader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            ・・・
            // make fog work
            #pragma multi_compile_fog

            ・・・
            
            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

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

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}
Surface Shader

pragma の 定義に nofog を追加することで無効にできます

#pragma surface surf Standard fullforwardshadows nofog

Fog の設定

Window/Rendering/Lighting Settins から ウィンドウを開いて Scene/Other Setting/Fog でOnOffやパラメータを変更できる

f:id:hacchi_man:20201016003402p:plain:w300