Unity Shaders and Effects Cookbook (3-5) 金属软高光
书上这一节看得我头昏脑胀,数学渣表示自理不能…… 并且也不了解这个效果的实际意义。
先记录下来,后面真正看懂了再来补充具体理论。
通过一张纹理贴图,定义高光的形状,利用到的纹理贴图有三种
这里并非把纹理 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 200 CGPROGRAM
#pragma surface surf Metallicsoft sampler2D _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"
}
測试效果
演示样例project下载:
http://pan.baidu.com/s/1bpDfEpT
Unity Shaders and Effects Cookbook (3-5) 金属软高光的更多相关文章
- 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...
- Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用
開始学习第4章 - 着色器的反射 看完了1.2节,来记录一下.反射主要是利用了 Cubemap 立方体贴图. 认识Cubemap 立方体贴图.就如同名字所说.在一个立方体上有6张图.就这样觉得吧. 假 ...
- Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
在学习完上一节之后.已经了解了在Unity 中怎样实现一个高光 Shader ,可是会有一个问题.就是效果看起来不切实际,如以下的问题 我用一张图片贴到了Cube上面.然后用了一个高光材质,得到了下图 ...
- Unity Shaders and Effets Cookbook
Unity Shaders and Effects Cookbook 最近在读 <Unity Shaders and Effects Cookbook> 中文名称:<Unity 着色 ...
- Unity Shader and Effects Cookbook问题记录
1.p61的specular计算,涉及到的一个参数“_SpecColor”是在Unity的官方cginc文件(UnityLightingCommon.cginc)中,是直接赋颜色给这个参数,反应到你模 ...
- 【Unity Shaders】Using Textures for Effects —— 实现Photoshop的色阶效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——打包和混合textures
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——让sprite sheets动起来
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Using Textures for Effects——通过修改UV坐标来滚动textures
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
随机推荐
- mysql 流程函数 存储引擎 InnoDB简单特性
建表及插入数据语句: mysql> create table salary(userid int,salary decimal(9,2)); Query OK, 0 rows affected ...
- 〖Linux〗proc的一些文件读取操作
/* * ===================================================================================== * * Filen ...
- android下载
1. 源码下载链接: http://source.android.com/source/downloading.html 参考链接: Android源码下载方法详解 2. SDK下载 http://d ...
- 快速激活JetBrains系列产品
本篇文章由:http://xinpure.com/quickly-activate-the-jetbrains-products/ lanyus.com 域名已被全面封杀,大家可以到 http://i ...
- Python OS 文件
Python OS 文件: 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作目录 3 os.chflags(path, flags) 设置路 ...
- Redis总结(一)Redis安装(转载)
最近项目中需要使用Redis,刚好这两天有时间,便总结记录一下Redis的安装,以及如何在.NET中使用Redis. Redis是一个用的比较广泛的Key/Value的内存数据库.目前新浪微博.Git ...
- C++:CursorType光标类型 和 LockType锁定类型
简要: CursorType光标类型: 1. AdOpenForwardOnly (默认值)一次只能向前移动一行. 2. AdOpenKeyset 打开键集类型游标. 3. AdO ...
- 自己的一个验证电话和ecshop验证电话
//验证电话 function checkPhone($phone) { $preg_mobile = preg_match("/^1\d{10}$/", $phone ); $p ...
- MySQL多线程同步-Transfer使用测试
由淘宝核心系统研发—数据库组开发的MySQL-Transfer,用于解决MySQL主从同步延迟的问题,从MySQL单线程到多线程的工作模式.可以观看@丁奇的相关资料: MySQL多线程同步-Trans ...
- 线程相关函数(6)-pthread_cond_wait(),pthread_cond_signal(), 条件变量
pthread_cond_tpthread_cond_initpthread_cond_destroypthread_cond_waitpthread_cond_timedwaitpthread_co ...