小記一下用法與問題,時更
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
文章列表