Unity shader with lightmap

小记一下用法与问题,时更

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中用一个新的坐标变量来计算lightmapuv,否则开始可能正确,但是博主在把模型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

 

 

 

 

 

 

 

 

posted @ 2017-01-11 09:04  战狼96  阅读(3517)  评论(0编辑  收藏  举报