Cook-Torrance光照模型
Cook-Torrance光照模型将物体粗糙表面看作由很多微平面组成,每一个微平面都可以看成一个理想的镜面反射体,物体表面粗糙程度由微平面斜率的变化来表示。越粗糙的表面由斜率变化越大,反之越小。
Cook-Torrance模型将光分为两个方面考虑,漫反射光强和镜面反射光强:Ic-t=Idiff+Ispec。
Idiff是漫反射光强,计算方式参照理想漫反射体(Lambert模型)的计算方式。Ispec是镜面反射光强,Ispec=KsIlRs。Cook-Torrance模型与phong、blinn-phong 模型的不同之处在于 Rs 的计算方法。Cook-Torrance的Rs计算公式如下:
F是菲涅尔反射系数。真实世界中,当视线和表面的夹角不同时,反射效果会有差别。例如,站在湖边上,自己脚边的水面,反射不明显,可以看到水下的东西;远处的水面,反射则十分明显。
D表示微平面分布函数。该项模拟物体表面是由无数微小的像镜子一样的平面组成,每一个微平面对于光线会根据自身的方向反射光线。最常使用的微平面分布函是 Backmann 分布函数:
m值用于度量表面的粗糙程度,较大的m 值对应于粗糙平面,较小的m 值对应与较光滑的表面;α 是顶点法向量 N 和半角向量 H 的夹角。其中可推导:
所以最终可得:
G是遮挡项。微平面间会出现三种情况:部分入射光被遮挡;部分反射光被遮挡;入射光反射光都没有被遮挡。
G=min(1,G1,G2)
代码实现如下:
Shader "Custom/Cook-Torrance" {
Properties {
mainTexture ("Texture", 2D) = "white" {}
specularColor("SpecularColor", Color) = (,,,)
fresnel0 ("Fresnel", Range(,)) = 0.5
roughness ("Roughness", Range(,)) = 0.5
ks("Ks",Range(,))=0.5
}
SubShader { Tags { "LightMode"="ForwardBase" }
LOD
Pass{
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
//#include "Light.cginc" // Use shader model 3.0 target, to get nicer looking lighting uniform float4 _LightColor0; sampler2D mainTexture;
float4 mainTexture_ST;
uniform float4 specularColor;
uniform float fresnel0;
uniform float roughness;
uniform float ks; struct v2f{
float4 pos:SV_POSITION;
float4 worldPos:TEXCOORD0;
float3 normal:NORMAL;
float2 uv:TEXCOORD1;
}; v2f vert(appdata_full v){
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.worldPos=mul(_Object2World,v.vertex);
o.normal=v.normal;
o.uv=TRANSFORM_TEX(v.texcoord, mainTexture);
return o;
} float4 frag(v2f o):COLOR
{
float4 worldPos=o.worldPos;
float3 worldNormal=normalize(mul(float4(o.normal,),_World2Object).xyz);
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float3 viewDir=normalize(_WorldSpaceCameraPos-worldPos).xyz;
float3 halfAngleDir=normalize(viewDir+lightDir); float vhDot=saturate( dot(viewDir,halfAngleDir));
float nhDot=saturate(dot(worldNormal,halfAngleDir));
float nlDot=saturate(dot(worldNormal,lightDir));
float nvDot=saturate(dot(worldNormal,viewDir)); float3 texColor= tex2D(mainTexture, o.uv); float3 Ispec;
float3 Idiff=(_LightColor0*specularColor*nlDot).xyz*texColor;
if(nlDot>){
//F项
float F =pow((1.0-vhDot),5.0);
F *= (1.0-fresnel0);
F += fresnel0; //D项
float d1=/(roughness*roughness*pow(nhDot,));
float d2=exp((nhDot*nhDot-)/(roughness*roughness*nhDot*nhDot));
float D=d1*d2; //G项
float g1=*nhDot*nlDot/vhDot;
float g2=*nhDot*nvDot/vhDot;
float G=min(,min(g1,g2)); float Rs=saturate((F*D*G)/(nvDot*nlDot)); Ispec=(Rs*specularColor*ks).xyz;
}
else
return float4(Idiff,); float3 finalColor=Idiff+Ispec; return float4(finalColor,);
} ENDCG
}
}
FallBack "Diffuse"
}
Cook-Torrance光照模型的更多相关文章
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- 由浅入深学习PBR的原理和实现
目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...
- Opengles 管线编程介绍
OpenGL ES 2.0可编程管道 上图橙色部分(Vertex Shader和Fragment Shader)为此管道的可编程部分.整个管道包含以下两个规范: 1) OpenGL ...
- Cook-Torrence Illumination Model 的一些数学说明
Cook-Torrence 光照模型如下: 这个Io就是计算后最终的光强,主要是用来计算镜面反射光,漫反射和环境光的计算和Phong模型一致. F:Fresnel反射系数.主要用来说明反射光强度占入射 ...
- Lambert(朗伯)光照模型 和Half Lambert的区别
Lambert-它不包括任何任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境.Lambert材质可以是透明的,在光线追踪渲染中发生折射,但是如果没有镜面属性,该类型就不会发生 ...
- [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析
0.前言 这篇文章写于去年的暑假.大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了<CG教程 ...
- Unity3D ShaderLab 车辆喷漆光照模型实战
这一篇,我们来创建一个车辆喷漆的光照模型.首先就是准备场景,新建Shader & Material. 过程比较简单,直接看完成的代码吧: Shader "91YGame/CarOut ...
- Unity3D ShaderLab 漫反射卷积光照模型
Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...
- Unity3D ShaderLab 静态贴图光照模型
Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...
- Unity3D ShaderLab Half Lambert光照模型
Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ...
随机推荐
- 【转】彻底理解ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- 【转】Java多线程编程(十)-并发编程原理(分布式环境中并发问题)
转载地址:http://blog.csdn.net/leicool_518/article/details/42268947 在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么 ...
- 【Linux】GCC编译器
[简介] GCC是Linux下的编译工具集,是GNU Compiler Collection的缩写,包含gcc g++ 等编译器.GCC工具集不仅能编译C/C++语言,其他例如Object-c.Pas ...
- sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别(转)
sqlite数据库存储table1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不 ...
- Linq实战 之 Linq to Sql及Entity Framework操作详解
Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity f ...
- 走进AOP In .NET
AOP是什么,有的译为面向方面编程,有的译为面向切面编程,我更加赞同后者.接下来,让我们一步步揭开AOP的面纱. AOP衍生自 编程中出现了一些用OOP技术无法捕捉和解决的问题.跟其他开发工具和思想一 ...
- java 添加到数据库的数据没有时分秒
检查hibernate实体类的映射文件日期类型把date 改为 java.util.Date
- 数据库架构设计的三种模式:share nothing , share everythong , share disk
数据库构架设计中主要有Shared Everthting.Shared Nothing.和Shared Disk: Shared Everthting:一般是针对单个主机,完全透明共享CPU/MEMO ...
- jQuery,Table表头固定插件chromatable存在的问题及解决办法
在最近的项目中需要将表格的表头固定,搜寻了大量的资料,发现chromatable插件还是比较方便的.但是当我在一个页面中多次使用 chromatable固定对个表格的表头时问题就出现了,首先说明系统的 ...
- Spring学习(三)——集成 Velocity
上篇文章http://www.cnblogs.com/wenjingu/p/3822989.html我们使用Gradle构建了一个简单的Spring MVC Web应用程序, 本篇将在上篇的基础上将j ...