Unity3D ShaderLab 静态贴图光照模型

其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果。

下面是在unity中关闭灯光和打开灯光的对比效果。所以这类着色器的缺点就是不会随着光源变化效果。

接下来,我们开始创建,首先通过软件MaCrea来制作我们的2D光照贴图,MaCrea软件

通过该软件可以快速制作一个完整的发光球体平面图。

软件地址:http://pan.baidu.com/s/1bnD7wkv

软件视频教学地址:http://pan.baidu.com/s/1c0rQDva

完成静态光照贴图的制作后。在unity中创建Shader,Material。

直接打开Shader脚本编辑:

1>Properties:

 Properties {

 _MainTint("Diffuse Color",Color) = (,,,)

 _MainTex ("Base (RGB)", 2D) = "white" {}

 _NormalMap("Normal Map",2D) = ""{}

 }

2>SubShader:

 CGPROGRAM

 #pragma surface surf Unlit vertex:vert

 float4 _MainTint;

 sampler2D _MainTex;

 sampler2D _NormalMap;

 struct Input {

 float2 uv_MainTex;

 float2 uv_NormalMap;

 float3 tan1;

 float3 tan2;

 };

//因为我们要使用单独的球体贴图来实现光照,所以我们无需使用Lambert光照函数,只需要申明自定义无光亮的光照函数;

3>光照函数

 inline fixed4 LightingUnlit(SurfaceOutput s, fixed3 lightDir, fixed3 atten){

 fixed4 c= fixed4(,,,);

 c.rgb = c*s.Albedo;

 c.a = s.Alpha;

 return c;

 }

//我们只希望通过外部物体来产生阴影,因为该着色器不受光源的;

4>计算球面贴图

 void vert(inout appdata_full v, out Input o){

 UNITY_INITIALIZE_OUTPUT(Input, o);

 TANGENT_SPACE_ROTATION ;

 o.tan1 = mul(rotation,UNITY_MATRIX_IT_MV[].xyz);

 o.tan2 = mul(rotation,UNITY_MATRIX_IT_MV[].xyz);

 }

//为了正确的检索到球面贴图,我们需要把正切旋转矩阵乘以当前模型的逆转模型视图;

5>完善surf

 void surf (Input IN, inout SurfaceOutput o) {

 float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap));

 o.Normal = normals;

 float2 litSphereUV;

 litSphereUV.x = dot(IN.tan1,o.Normal);

 litSphereUV.y = dot(IN.tan2,o.Normal);

 half4 c = tex2D (_MainTex, litSphereUV*0.5+0.5);

 o.Albedo = c.rgb*_MainTint;

 o.Alpha = c.a;

 }

通过以上的步骤,我们完成这个静态的光照模型。返回unity中简单设置后,就可以看出效果了。

在上面的过程中,最主要的是vert函数,因为在这个函数里,我们把旋转切向量和逆转模型视图矩阵相乘,在赋值给o.tan1和o.tan2。

这个计算就是把向量弯曲到何时的位置来检索球面的贴图。而逆转模型视图则是我们利用unity内置的值。

通过上面的检索传递后,我们简单的将IN.tan1和IN.tan2的值作为球面贴图纹理检索的uv值,

我们可以直接使用input结构体中的值,因为我们也在vert函数中将这些值传递进去了。

 Shader "91YGame/LightStatic" {
Properties {
_MainTint("Diffuse Color",Color) = (,,,)
_MainTex ("Base (RGB)", 2D) = "white" {}
_NormalMap("Normal Map",2D) = ""{}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf Unlit vertex:vert float4 _MainTint;
sampler2D _MainTex;
sampler2D _NormalMap; struct Input {
float2 uv_MainTex;
float2 uv_NormalMap;
float3 tan1;
float3 tan2;
}; inline fixed4 LightingUnlit(SurfaceOutput s, fixed3 lightDir, fixed3 atten){
fixed4 c= fixed4(,,,);
c.rgb = c*s.Albedo;
c.a = s.Alpha;
return c;
} void vert(inout appdata_full v, out Input o){
UNITY_INITIALIZE_OUTPUT(Input, o); TANGENT_SPACE_ROTATION;
o.tan1 = mul(rotation,UNITY_MATRIX_IT_MV[].xyz);
o.tan2 = mul(rotation,UNITY_MATRIX_IT_MV[].xyz);
} void surf (Input IN, inout SurfaceOutput o) {
float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap));
o.Normal = normals; float2 litSphereUV;
litSphereUV.x = dot(IN.tan1,o.Normal);
litSphereUV.y = dot(IN.tan2,o.Normal); half4 c = tex2D (_MainTex, litSphereUV*0.5+0.5);
o.Albedo = c.rgb*_MainTint;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

Unity3D ShaderLab 静态贴图光照模型的更多相关文章

  1. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  2. Unity3D ShaderLab法线贴图

    Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...

  3. Unity3D ShaderLab 漫反射卷积光照模型

    Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...

  4. Unity3D ShaderLab 立方体图的菲涅尔反射

    Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...

  5. Unity3D ShaderLab立方体图的法线渲染

    Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ...

  6. Unity3D ShaderLab 立方体图的反射遮罩

    Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张纹理对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的sha ...

  7. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  8. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  9. Unity3D ShaderLab Half Lambert光照模型

    Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ...

随机推荐

  1. iOS视频直播初窥:高仿<喵播APP>

    视频直播初窥 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, 要 ...

  2. backbonejs中的集合篇(一)

    一:集合概念 集合是多个模型,如果把模型model理解为表结构中的行,那么集合collection就是一张表,由多个行组成.我们经常需要用集合来组织和管理多个模型. 二:创建集合 1:扩展Backbo ...

  3. 有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)

    各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...

  4. return false取消手机移动端的默认设置

    想做一个语音界面,当长按语音按钮的时候,总会出现移动端什么复制粘贴菜单.然后在JS中加入return false后就消失了,感觉好神奇哦~

  5. 目前几款基于html5的前端框架:如Bootstrap、Foundation、Semantic UI 、Amaze UI

    Bootstrap是由Twitter在2011年8月推出的开源WEB前端框架,集合CSS 和HTML,使用了最新的浏览器技术,为快速WEB开发提供了一套前端工具包,包括布局.网格.表格.按钮.表单.导 ...

  6. http://www.html-js.com/article/2328

    React.js编程思想 张小俊128 发布在使用React.js开发web应用2015年8月7日view:33385React 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. ...

  7. (BFS)hdoj2377-Bus Pass

    题目地址 因为最后要看的是到所有路线上的区域最大距离最小的中心点,所以可以采取遍历路线上所有的区域,对每个区域进行BFS的办法.为了更方便的在每一次BFS都遍历所有的区域,可以加一个reach数组,记 ...

  8. Zooming MKMapView to fit annotation pins

    http://stackoverflow.com/questions/4680649/zooming-mkmapview-to-fit-annotation-pins - (MKCoordinateR ...

  9. Java并发编程(二)线程任务的中断(interrupt)

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回. ...

  10. java udp网络编程

    import java.net.*; /* 通过UDP传输发送文字数据 1.建立socket服务 2.提供数据,并封装到数据包中 3.通过sokect服务的发送功能,将数据包发送出去 4.关闭资源 * ...