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>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
随机推荐
- 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...
- ORID方法在敏捷中的利用
Objective: 上个迭代有哪些让你印象深刻的事情发生?你看到了什么? Reflective:哪些场景让你兴奋?哪些地方不那么顺利? Interpretive:为什么会不顺利?这些数据使你意识到了 ...
- redis.windows.conf各项配置参数介绍 (九)
# 默认情况下,redis不是在后台模式运行的,如果需要在后台进程运行,把该项的值更改为yes,默认为no daemonize:是否以后台daemon方式运行 # 如redis服务以后台进程运行的时候 ...
- 父级和 子集 controller 之间的通讯
在同个 angular.js 应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种: 基于scope继承的方式 基于event传播的方式 基于scope继承的方式 最简单的让控制器之间进行通 ...
- centos中安装openjdk
openjdk的java环境还是简单好用,至于其他的,现在又用不到,为啥要费事安装它们? 步骤: 1.yum search java | grep jdk [root@noi ~]# yum sear ...
- Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(注释行数,空白的行数), 方法数,class数 1 2. 过滤器 ...
- InnoDB存储引擎表的逻辑存储结构
1.索引组织表: 在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则Inn ...
- libxml2实例
// libxmlTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #includ ...
- UltraISO制作启动盘及提取U盘为ISO镜像
我们先来说下UltraISO这个工具,中文名也叫软碟通,他是一个无需量产你的U盘就可以把U盘做成启动盘的工具,当然了,这么强大的工具肯定不是免费版的,对,他是共享的:但是你可以下载特别版嘛..网上到处 ...
- centos 搭建nginx
yum install wget yum install gcc-c++ yum -y install pcre prec-devel yum -y install zlib zlib-devel y ...