这一篇,我们来创建一个车辆喷漆的光照模型。首先就是准备场景,新建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. css背景定位

    日期:2015-12-05 背景定位算是才弄明白: background-position:50% 50%; 图片水平和垂直居中.与 background-position:center center ...

  2. 教你如何用PS制作多款按钮UI设计教程

    教你如何用PS制作多款按钮UI设计教程 本文教大家制作按钮的方法 LV. ★ 初入设计,学做按钮.只会套个底色,加个阴影,字体纯白,小聪明的弄个圆角. LV. ★★(描边.字体.内阴影) 看了很多案例 ...

  3. 支持新版chrome,用webstorm编译形成css和sourcemap,调试sass和less源文件(转)

    旧版的chrome有个support for sass,但是新版chrome没有这个功能了.看到网上提供的方法比较多,也很乱,旧版新版的都有.而且不能指定自己所需要的路径. 所以就做了下改版. sas ...

  4. group_concat函数与find_in_set()函数相结合

    一:group_concat函数详解 1.语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'] ...

  5. UESTC 2016 Summer Training #1 Div.2

    最近意志力好飘摇..不知道坚不坚持得下去.. 这么弱还瞎纠结...可以滚了.. 水题都不会做.. LCS (A) 水 LCS (B) 没有看题 Gym 100989C 水 1D Cafeteria ( ...

  6. 25个有用和方便的 WordPress 速查手册

    如果你是一个 WordPress 编码器或开发人员,下载一些方便的 WordPress 备忘单寻找你的工作然后你在正确的地方.我们已经列出了25个有用的和方便的 WordPress 速查手册.Word ...

  7. 经典SQL语句大全.doc

    1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 ...

  8. spring mvc环境配置

    spring mvc将所有的请求都经过一个servlet控制器-DispatcherServlet,这个servlet的工作就是将一个客户端的request请求分发给不同的springmvc控制器,既 ...

  9. soap base64 调用

      xsd__base64Binary data;     data.__ptr = (unsigned char*) soap_malloc(_soapProxy,picLen);     data ...

  10. LA 5059 - Playing With Stones

    博弈 SG  由于每个a太大,没有办法递推,但是可以找规律 a为偶数  SG(a)=a/2 a为奇数  SG(a)=SG(a/2) 代码: #include <iostream> #inc ...