Unity Shaders and Effects Cookbook (3-5) 金属软高光
来源:互联网 发布:r语言累加编程 编辑:程序博客网 时间:2024/04/28 15:22
书上这一节看得我头昏脑胀,数学渣表示自理不能…… 而且也不了解这个效果的实际意义。
先记录下来,后面真正看懂了再来补充详细理论。
通过一张纹理贴图,定义高光的形状,利用到的纹理贴图有三种
这里并不是把纹理 UV映射。而是读取了 R通道值。
这几张图都是黑白的,也就是说,像素的一个点的 RGB 是相同值,所以 读取 R 或者 读取 G、B都是同等的。
着色器代码为高光生成了一些粗糙度值。
然后这节利用菲涅尔法则,当我们的视线刚好正对着物体表面的时候,会帮我们屏蔽高光。
转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn
这一节的完整Shader代码:
Shader "CookBookShaders/Metallicsoft" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_MainTint ("Diffuse Tint",Color)=(1,1,1,1)_RoughnessTex("Roughness Texture",2D)="white"{}_Roughness("Roughness",Range(0,1))=0.5_SpecularColor("Specular Color",Color)=(1,1,1,1)_SpecularPower("Specular Power",Range(0,30))=2_Fresnel("Fresnel",Range(0,1.0))=0.05}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Metallicsoftsampler2D _MainTex;float4 _MainTint;sampler2D _RoughnessTex;float _Roughness;float4 _SpecularColor;float _SpecularPower;float _Fresnel;struct Input {float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o) {half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;o.Albedo = c.rgb;o.Alpha = c.a;}inline fixed4 LightingMetallicsoft(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten){//先计算出来所有的漫反射以及视点相关的向量;float3 halfVector=normalize(lightDir + viewDir);float NdotL=saturate(dot(s.Normal,normalize(lightDir)));float NdotH_raw=dot(s.Normal,halfVector);float NdotH = saturate(dot(s.Normal,halfVector));float NdotV=saturate(dot(s.Normal,normalize(viewDir)));float VdotH=saturate(dot(halfVector,normalize(viewDir)));//生成一些粗糙度值,然后从纹理中读取高光形状float geoEnum=2.0*NdotH;float3 G1=(geoEnum * NdotV)/NdotH;float3 G2=(geoEnum * NdotL)/NdotH;float3 G= min(1.0f,min(G1,G2));float roughness=tex2D(_RoughnessTex,float2(NdotH_raw * 0.5 +0.5,_Roughness)).r;//菲涅尔准则;当我们视线正好对着物体表面时,会帮我们屏蔽高光;float fresnel=pow(1.0-VdotH,5.0);fresnel*=(1.0-_Fresnel);fresnel+=_Fresnel;//组合计算高光值;float3 specular=float3(fresnel * G * roughness * roughness) * _SpecularPower;//漫反射 加上 高光 float4 c;c.rgb=(s.Albedo * _LightColor0.rgb * NdotL)+(specular * _SpecularColor.rgb)*(atten * 2.0f);c.a=s.Alpha;return c;}ENDCG} FallBack "Diffuse"}
测试效果
示例工程下载:
http://pan.baidu.com/s/1bpDfEpT
0 0
- Unity Shaders and Effects Cookbook (3-5) 金属软高光
- Unity Shaders and Effects Cookbook (3-6) 创建各向异性高光类型(Anisotropic) 模拟金属拉丝效果
- Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model
- Unity Shaders and Effects Cookbook (4-3)遮罩反射
- 【Unity Shaders and Effects Cookbook】Diffuse Shading
- 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
- 【Unity Shaders and Effects Cookbook】Using Textures for Effects
- unity-Unity 5.x Shaders and Effects Cookbook(2nd)
- Unity Shaders and Effects Cookbook 中的Packing and blending textures
- Unity Shaders and Effects Cookbook (3-1) 使用Unity 内置的Specular Lighting - BlinnPhong
- Unity Shaders and Effects Cookbook Chap 1 读书个人小结
- Unity Shaders and Effects Cookbook (6-4) GUI 和 透明度
- Unity Shaders and Effects Cookbook中的Photoshop levels effect
- Unity Shaders and Effects Cookbook (3-3) 创建 BlinnPhong 光照模型
- Unity Shaders and Effects Cookbook (2-5) 如何使用法线贴图
- Unity Shaders and Effects Cookbook (4-5)Cubemap与菲涅尔反射
- Unity Shaders and Effects Cookbook (1-3) 创建 Half Lambert 光照模型
- Unity Shaders and Effects Cookbook (3-2) 创建简单的 Phong 高光 光照模型
- sdsd
- offer题11 数值的整数次方&判断浮点型是否相等&降低求n次方的时间复杂度&3种错误处理方式
- win32 汇编 当心 .if eax
- Hibernate的核心接口 --- Query查询详解
- Tyvj_P1012
- Unity Shaders and Effects Cookbook (3-5) 金属软高光
- 动手实现自己的Crouton
- apio2007 动物园
- 移动端与服务端数据交互时的一个坑
- 关于《算法的乐趣》历法一章演示程序错误的说明
- ArcGIS SOE开发
- 一看就懂系列之 php中的生产者and消费者模式
- 4.13 学习笔记(Iterator,分拣存储)
- 第71课:Spark SQL窗口函数解密与实战学习笔记