テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

BumpmapにLightmapを使うと凹凸が消える問題の対処法

今日はBumpmapのあるモデルでライトマップを焼くトラブルの解決策について紹介します。

 

f:id:tsubaki_t1:20141017000145p:plain

 

 

例えば、下のようなモデルをライトマップで焼くと、bumpmapの効果を無視し非常に「のっぺりとした」絵になってしまいます。

f:id:tsubaki_t1:20141016233239p:plain

f:id:tsubaki_t1:20141016233247p:plain

 

これを解決は以下のサイトで紹介されていました。


Unity Free - Normalmap AND lightmap? | Unity Community

 

要するに以下のシェーダーをBumpmap Defuseの変わりに設定します。

    Shader "Custom\BumpedLightmapped" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _Dummy ("Dummy", 2D) = "white" {}
            _BumpMap ("Normalmap", 2D) = "bump" {}
           
        }
       
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
           
            CGPROGRAM
            #pragma surface surf Lambert nolightmap
     
            sampler2D _MainTex;
            sampler2D unity_Lightmap;
            float4 unity_LightmapST;
            sampler2D _Dummy;
            sampler2D _BumpMap;    
           
            struct Input {
                float2 uv_MainTex;
                float2 uv2_Dummy;
                float2 uv_BumpMap;
            };
     
            void surf (Input IN, inout SurfaceOutput o) {
           
                fixed4 tex  = tex2D (_MainTex, IN.uv_MainTex);
                float2 lmuv = IN.uv2_Dummy.xy * unity_LightmapST.xy + unity_LightmapST.zw;
                o.Albedo    = tex.rgb * DecodeLightmap( tex2D (unity_Lightmap, lmuv) );
                o.Alpha     = tex.a;
                o.Normal    = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));    
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

 

これで、のっぺりだった画像が以下のようになります。

f:id:tsubaki_t1:20141016233617p:plain

 

このシェーダーをカスタマイズすれば、スペキュラーとかも対応出来るかもしれません。