Unity3D ShaderLab 车辆喷漆光照模型实战

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

}

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

Unity3D ShaderLab 车辆喷漆光照模型实战

Unity3D ShaderLab 车辆喷漆光照模型实战

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

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

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

上一篇:Oracle官网下载地址大全(包括11g、10g和9i)


下一篇:C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)