Unity3D ShaderLab 静态贴图光照模型
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 静态贴图光照模型的更多相关文章
- Unity3D ShaderLab 使用贴图对模型的高光进行遮罩
		Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ... 
- Unity3D ShaderLab法线贴图
		Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ... 
- Unity3D ShaderLab 漫反射卷积光照模型
		Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ... 
- Unity3D ShaderLab 立方体图的菲涅尔反射
		Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ... 
- Unity3D ShaderLab立方体图的法线渲染
		Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ... 
- Unity3D ShaderLab 立方体图的反射遮罩
		Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张纹理对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的sha ... 
- Unity3D ShaderLab 简单的立方体图反射
		Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ... 
- Unity3D ShaderLab压缩混合纹理贴图
		Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ... 
- Unity3D ShaderLab Half Lambert光照模型
		Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ... 
随机推荐
- .net读取xml文件中文乱码问题解决
			读取XML的编码方式Encoding.UTF8 要和<?xml version="1.0" encoding="utf-8"?>的encoding ... 
- 客户信贷管理&临时授信
			信贷额度的组成:假如某客户信用限额1万:开出销售订单时锁定1万:一旦发货1万,销售订单1万限额释放,变成发货锁定限额1万.一旦开票,发货1万限额释放,应收锁定1万限额.清帐成功,应收释放1万.信用限额 ... 
- WebDataTree 使用XML做数据源绑定数据
			英文版原文链接:http://www.infragistics.com/help/topic/e5f07b51-ee2d-4a33-aaac-2f43cffff327 所使用的控件版本为:Infrag ... 
- mysql str_to_date字符串转换为日期
			mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期. 示例:分隔符一致,年月日要一致 select str_to_date('2008-4-2 15:3:28','% ... 
- PHP函数——parse_ini_file() 函数
			资料网址:http://www.w3school.com.cn/php/func_filesystem_parse_ini_file.asp 1.parse_ini_file() 函数解析一个配置文件 ... 
- 使用@Controller注解为什么要配置<mvc:annotation-driven />
			自己看了官方文档,也到网上查了下,目前理解如下: <mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和Annotat ... 
- Eclipse  汉化包
			http://www.eclipse.org/babel/downloads.php 下载地址,具体操作请百度. http://subclipse.tigris.org/update_1.6.x SV ... 
- laypage分页功能demo
			demo代码如下: <div id="view1"></div> <div id="page1"></div> ... 
- 修改Widows网络设置提升网速
			可能很多用户不知道,我们在使用Windows系统连接Internet,系统默认保留20%的带宽,也就是说我们进行网络数据传输所能使用的带框仅为实际带宽的80%,但是我们修改网络设置或的最大带宽. 1. ... 
- C#在线更新程序[下载程序、解压缩程序、控制台程序]
			[1]下载文件 using System;using System.Collections.Generic;using System.Linq;using System.Text;using Syst ... 
