这一篇,我们来创建一个车辆喷漆的光照模型。首先就是准备场景,新建Shader & Material。

过程比较简单,直接看完成的代码吧:

Shader "91YGame/CarOutLight" {

Properties {

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

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

_SpecularColor("Specular Color",Color)=(,,,)

_SpecPower("Specular Power",Range(0.1,))=

_RelfCube("Reflection Cube",Cube) = ""{}

_BRDFTex("BRDF Texture",2D)=""{}

_DiffusePower("Diffuse Power",Range(0.1,))=0.5

_FalloffPower("Falloff Spread",Range(0.1,))=

_ReflAmount("Reflection Amount",Range(0.1,))=0.5

_ReflPower("Reflection Power",Range(0.1,))=2.0

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 

CGPROGRAM

#pragma surface surf CarPaint

sampler2D _MainTex;

sampler2D _BRDFTex;

float4 _MainTint;

float4 _SpecularColor;

fixed _SpecPower;

fixed _DiffusePower;

fixed _FalloffPower;

fixed _ReflAmount;

fixed _ReflPower;

samplerCUBE _RelfCube;

struct Input {

float2 uv_MainTex;

float3 worldRefl;

float viewDir;

};

inline fixed4 LightingCarPaint(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten){

half3 h = normalize(lightDir+viewDir);

fixed diff = max(,dot(s.Normal,lightDir));

float ahdn = -dot(h,normalize(s.Normal));

ahdn = pow(clamp(ahdn,,),_DiffusePower);

half4 brdf = tex2D(_BRDFTex,float2(diff,-ahdn));

float nh = max(,dot(s.Normal,h));

float spec =pow(nh,s.Specular*_SpecPower)*s.Gloss;

fixed4 c;

c.rgb = (s.Albedo*_LightColor0.rbg*brdf.rgb + _LightColor0.rgb*_SpecularColor.rgb*spec)*(atten*);

c.a = s.Alpha+_LightColor0.a*_SpecularColor.a*spec*atten;

return c;

}

void surf (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

fixed falloff = saturate(-dot(normalize(IN.viewDir),o.Normal));

falloff = pow(falloff,_FalloffPower);

o.Albedo = c.rgb*_MainTint;

o.Emission = pow((texCUBE(_RelfCube,IN.worldRefl).rgb*falloff),_ReflPower)*_ReflAmount;

o.Albedo = c.rgb*_MainTint;

o.Specular = c.r;

o.Gloss =;

o.Alpha = c.a;

}

ENDCG

} 

FallBack "Diffuse"

}

完成以后,返回编辑器,查看效果吧:

在上面的实现过程中,用到了之前说到的一些技术,我们利用BRDF来创建包含两种渐变色彩的喷漆。

再简单的计算出一个菲涅尔系数,以及一个递减的元素来决定车辆表面的反射强度。

所有这些光照强度都是由Properties模块中的ui值决定的。这样最大限度的方便美术人员。

Unity3D ShaderLab 车辆喷漆光照模型实战的更多相关文章

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

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

  2. Unity3D ShaderLab Half Lambert光照模型

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

  3. Unity3D ShaderLab 静态贴图光照模型

    Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...

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

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

  5. Unity3D ShaderLab 各向异性高光

    Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...

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

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

  7. Unity3D ShaderLab 使用BlinnPhong高光类型

    Unity3D shaderLab 使用BlinnPhong高光类型 上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所 ...

  8. Unity3D ShaderLab 创建自定义高光类型

    Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数 ...

  9. Unity3D ShaderLab 基础的高光实现

    Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现 ...

随机推荐

  1. HTTP && socket

    http://blog.csdn.net/zeng622peng/article/details/5546384 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终 ...

  2. php提示Fatal error: Call to undefined function imagecreate()

    在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会 / ...

  3. Java--常用类summary

    /* 2:API的概述(了解) (1)应用程序编程接口. (2)就是JDK提供给我们的一些提高编程效率的java类. 3:Object类(掌握) (1)Object是类层次结构的根类,所有的类都直接或 ...

  4. Mysql复制表格

    1.复制表结构及数据到新表 CREATE TABLE 新表 as SELECT * FROM 旧表 不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key.Extra(auto_i ...

  5. K2工作流的使用

    K2的工作流作为工作流中的战斗机,被各大企业争相抢购着,当然我们公司也买了,用起来确实方便也的确很强大. 主要分两的模块: 一.K2.net 2003 Service Manager 以上是对配置用户 ...

  6. shell学习记录001-知识点储备

    1.BASH(bourne again shell ) cmd1 ;cmd2等同于 cmd1 cmd2 2.echo music; 中的分号不被打印出,因为分号默认为命令定界符号 3.利用pgrep找 ...

  7. javascript——拖拽(完整兼容代码)

    拖拽,是JS经常会用到的效果,在网上有很多的这样那样的拖拽效果,但其中往往大多有各种各养的问题,功能不全,无法兼容,而且修改的时候 也是十分麻烦. 其实拖拽的原理很简单,无非是鼠标的三个动作的解析,以 ...

  8. Validform自定义提示效果-使用自定义弹出框

    $(function(){ $.Tipmsg.r=null; $("#add").Validform({ tiptype:function(msg){ layer.msg(msg) ...

  9. Android中findViewById()获取EditText 空指针问题

    因为EditText editText = (EditText)layout.findViewById(R.id.input_content);是从Dialog对话框布局layout中寻找ID为inp ...

  10. oracle安装后登录

    运行 sqlplus回车 longon as sysdba回车 回车 这样就可以登录了. SQL>create user username identified by password; SQL ...