文章出處

小記一下用法與問題,時更

surface shader就不用操心了,自帶lightmap計算

主要是vertex fragment shader部分

 

Unity5 bake light map有三種情況:

1.Non-directional

2.directional

3.directional specular

 

 

Non-directional

 

這種計算最為簡單,消耗也最少,

注意不會烘焙上normal map的信息,只是模型頂點法線計算得的diffuse結果

 

首先需要聲明lightmap變量

sampler2D unity_Lightmap;

float4 unity_LightmapST;



重復聲明異常(unity 5.4),在UnityCG.cginc已經聲明過了,就不用再聲明

需要在appdata中用一個新的坐標變量來計算lightmap的uv,否則開始可能正確,但是博主在把模型generate lightmap uv后再烘焙,uv全部都是錯的了。

        structappdata {

            float4vertex : POSITION;

            float4tangent : TANGENT;

            float3normal : NORMAL;

            float2texcoord : TEXCOORD0;

            float2texcoord2 : TEXCOORD1;

            fixed4color : COLOR;

        };



 

然后vertex部分的struct聲明(名字隨意)

float2 uv_lightmap : TEXCOORD1;

 

vertex shader生成計算lightmap uv

o.uv_lightmap =v.texcoord2.xy *unity_LightmapST.xy + unity_LightmapST.zw;



 

在fragment shader中獲取lightmap數據的方法,得到的是三元向量,如果未烘焙默認值為0:

DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,i.uv_lightmap))



 

判斷是否烘焙,這樣就可以分為兩種算法,沒有lightmap就實時算,有lightmap就用

        #ifdefLIGHTMAP_ON

DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,i.uv_lightmap))。。。。lightmap相關計算

        #endif


烘焙lightmap后,shader獲取的陰影自陰影信息為1,光照方向為0(與光的Baking模式設置有關,realtime(有)/mixed(有)/baked(無))

 

 

directional specular

這種會產生兩種lightmap,一種是帶normal map的diffuse信息也就是普通的light map,一種是direction map也就是光照方向,我們可以使用烘焙的光照方向來計算specular及其他

 

應該是這樣可以得到direction map,但是博主試過會報錯

 UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd,unity_Lightmap,1);

 

 

 

 ---wolf96 2017/1/11


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()