这一篇,我们来创建一个车辆喷漆的光照模型。首先就是准备场景,新建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. IO流--切割 合并文件

    import java.io.*; import java.util.*; public class io { public static void main(String[] args)throws ...

  2. SAP采购申请审批记录增强

    业务需要,开发就搞.... EBAN中增强结构:CI_EBANDB ANAME 类型 UNAME 用户名 ADATE 类型 AEDAT DATS 更改日期 ATIME 类型 UZEIT TIMS 时间 ...

  3. 转载 Javascript继承两种形式详解

    一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...

  4. DOM解析和SAX解析的区别

    DOM解析和SAX解析的区别 博客分类: XML DOM SAX  DOM解析和SAX解析的区别 No 区 别 DOM解析 SAX解析 1 操作 将所有文件读取到内存中形成DOM树,如果文件量过大,则 ...

  5. MySql中添加用户/删除用户

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  6. outlook 用宏发邮件

    经常发面试邮件,通常只是修改一下收件人邮箱地址,和收件人姓名,其他全部一致,有木有发现每次都用用outlook写邮件很麻烦? 使用宏发邮件,就会不麻烦了,直接修改下称呼,修改下收件人地址,按下F5,就 ...

  7. Windows API 文件处理

    CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirect ...

  8. 使用AlarmManager定时更换壁纸----之一

    import android.os.Bundle;import android.app.Activity;import android.app.AlarmManager;import android. ...

  9. iframe子页面与父页面通信

    同域下父子页面的通信 父页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset ...

  10. iOS 登陆的实现四种方式

    iOS 登陆的实现四种方式 一. 网页加载: http://www.cnblogs.com/tekkaman/archive/2013/02/21/2920218.ht ml [iOS登陆的实现] A ...