旅行しながら働く ムラサメ研究所社長ブログ

主にゲームやプログラミングのログ

UNITYシェーダ研究 Ambient

コード
https://github.com/YukiMiyatake/UnityLesson/tree/Shader_5

前回のシェーダ

ディフューズとスペキュラを実装し、だいぶライティングができた
テクスチャマッピングもしている

でも、Ambientも与えていません

Ambientの設定

UNITYのバージョンにより違うけど
最近のバージョンでは
Window-Lighting-Setting から行う

f:id:murasame-labo:20170922015418p:plain

Environment Lightingのあたり

Ambientの取得

Ambinetカラーの取得は定数が用意されているので簡単だ

UNITY_LIGHTMODEL_AMBIENT.rgb;

これを計算式に加えるが
テクスチャ * Ambientの値を今までのものに足せばよいので最終的には

最終カラー = Ambientテクスチャ + Diffuseテクスチャ + スペキュラ
= (Ambient+Diffuse) * テクスチャ + スペキュラ
にした

             float3 frag(v2f i) : SV_Target
                {
                    float3 L = normalize(_WorldSpaceLightPos0.xyz);
                    float3 V = normalize(_WorldSpaceCameraPos - i.vertexW.xyz);
                    float3 N = i.normal;
                    float3 H = normalize(L + V);


                    //Ambient
                    float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
                    
                    // texture albedo
                    float4 tex = tex2D(_MainTex, i.uv);

                    // Diffuse(HalfLambert)
                    float3 NdotL = dot(N, L);
                    float3 diffuse = (NdotL*0.5 + 0.5) * _LightColor0.rgb;

                    // Speculer
                // float3 specular = pow(max(0.0, dot(reflect(-L, N), V)), _Spec1Power) * _Spec1Color.xyz;  // reflection
                    float3 specular = pow(max(0.0, dot(H, N)), _Spec1Power) *  _Spec1Color.xyz;  // Half vector


                    return (ambient + diffuse) * tex + specular;
                }