Lamertian模型描述了当光源直接照射到粗糙物体表面时,反射光线的分布情况。在现实中,除了直接光照,还有来自周围环境的间接光照

直接照射到物体表面的光照,又称为局部光照

间接照射到物体表面的光照,又称为全局光照

左图中点x接收到周围环境的光线照射,来自周围表面的反射光照称为全局光照;右图中点x接收来自太阳光的直接照射,来自太阳发射的直接光照称为局部光照。

在现实环境中,全局光照的情况更为复杂,例如:

  • 半透明表面(Semi-transparent surfaces):光线可以穿过表面进行复杂的交互,如玻璃棱镜,可以改变光的波长;
  • 次表面散射(Sub-Surface Scattering):光线可以穿过子表面,在同一表面的不同方向反射,如皮肤;
  • 表面渗色(Surface bleeding):光线穿过表面,在介质中改变颜色到目标表面。

其他例子还有很多,全局光照会比局部光照效果更佳柔和自然。我们在前篇中所研究的Lambertain BRDF光照模型为局部光照模型,还欠缺了全局光照因素。

环境光照Ambient

在实时渲染中模拟全局环境光照还是有一定难度的,通常为了不使场景中在没有全局光照射的情况下呈现黑暗,可理想的认为环境光均匀分布在所有物体表面。

即环境光与位置\({p}\)和方向\({\omega_i}\)无关,在所有表面都呈现同一颜色,表示为:

\({L_i} = {l_sc_l}\)

其中,\({l_s}\)表示光照强度系数,\({c_l}\)表示光照颜色。

(未完待续,此处需补充双半球反射率\({\rho_{hh}}\))

Phong反射模型

Lamertian模型是粗糙表面的理想反射模型,当光线照射到光滑表面会产生高光,Phong反射模型(Phong reflection model,1973)是其中一类的有向光照的镜面反射模型。

根据光的反射定律:入射光线与反射光线成相同角度。

用\({l}\)表示入射光线,\({r}\)表示出射光线,\({n}\)表示物体表面法线,那么存在如下方程关系:

式①:\({r} = {al} + {bn}\)

上式中,\({a}\)和\({b}\)为常数项。对上式左右两边同乘\({n}\):

\({r \cdot n} = {al \cdot n} + {bn \cdot n}\)

得到式②:\({(1 - a)l \cdot n} = {b}\)

如果用\({n}^{\perp}\)表示与表面法线\({n}\)垂直的向量,那么\({l}\)与\({r}\)在\({n}^{\perp}\)上的投影应为相反的向量,\({r} = -{l}\):

\({r \cdot n^{\perp}} = {al \cdot n^{\perp}} + {bn \cdot n^{\perp}}\)

\({-l \cdot n^{\perp}} = {al \cdot n^{\perp}}\)

得:\({a} = -1\)

代入式①和式②中,可得\({r}\)的表达式:

\({r} = -{l} + {2(n \cdot l)n}\)

围绕在反射光线\({r}\)附近的反射辐射度应随\({\omega_o}\)与\({r}\)之间的夹角\({\alpha}\)的增加而减少。

Phong模型的镜面反射部分表示为\({\cos \alpha}^{e} = {r \cdot \omega_o}^{e}\),\(\alpha \in {[0, \frac{\pi}{2}]}\),\({\cos \alpha} \in {[0, 1]}\),\({e}\)与\(\alpha\)存在如下函数分布关系:

分布图中y轴代表\({e}\),x轴代表\(\alpha\),当\({e}\)增大时,随\(\alpha\)的增加而快速收敛。

至此可知Phong的BRDF高光项为:\({f_{r, s}(l, \omega_o)} = {k_s(r \cdot \omega_o)^{e}}\)

其中,\({k_s} \in [0, 1]\)表示为高光系数。

(未完待续)

PBR Step by Step( 五)Phong反射模型的更多相关文章

  1. PBR Step by Step(四)Lambertian反射模型

    光照可分为局部光照和全局光照. 局部光照:直接照射到物体表面的光照 全局光照:物体表面受周围环境影响的光照 左图中点x接收到周围环境的光线照射,来自周围表面的反射光照称为全局光照:右图中点x接收来自太 ...

  2. 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 1.Programming assignments:Building a recurrent neural network - step by step

    Building your Recurrent Neural Network - Step by Step Welcome to Course 5's first assignment! In thi ...

  3. enode框架step by step之框架要实现的目标的分析思路剖析1

    enode框架step by step之框架要实现的目标的分析思路剖析1 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件驱动架构(EDA)的应用开发框架enode ...

  4. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  5. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  6. Step by Step

    数据库设计Step by Step篇目整理及下载地址 系列篇目 1. 数据库设计 Step by Step (1)——扬帆启航 2. 数据库设计 Step by Step (2)——数据库生命周期 3 ...

  7. WPF Step By Step 自定义模板

    WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...

  8. WPF Step By Step 系列 - 开篇 ·

    WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...

  9. 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法

    先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝  扩展Baby Step Gian ...

随机推荐

  1. Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令

    Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令 ------------------------------------------------------------------ ...

  2. Spring boot中使用log4j记录日志

    之前在Spring Boot日志管理一文中主要介绍了Spring Boot中默认日志工具(logback)的基本配置内容.对于很多习惯使用log4j的开发者,Spring Boot依然可以很好的支持, ...

  3. 面试整理(3)js事件委托

    事件委托主要用于一个父容器下面有很多功能相仿的子容器,这时候就需要将子容器的事件监听交给父容器来做.父容器之所以能够帮子容器监听其原理是事件冒泡,对于子容器的点击在冒泡时会被父容器捕获到,然后用e.t ...

  4. Python作业选课系统(第六周)

    作业需求: 角色:学校.学员.课程.讲师.完成下面的要求 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 ...

  5. 生产环境手把手部署ERC20智能合约

    工具 rimex http://remix.ethereum.org/ metamask https://metamask.io/ ERC20 代码 https://github.com/OpenZe ...

  6. SVMtrain的参数c和g的优化

    SVMtrain的参数c和g的优化 在svm训练过程中,需要对惩罚参数c和核函数的参数g进行优化,选取最好的参数 知道测试集标签的情况下 是让两个参数c和g在某一范围内取离散值,然后,取测试集分类准确 ...

  7. ansible 下lineinfile详细使用 【转】

    转自 ansible 下lineinfile详细使用 - 散人 - 51CTO技术博客http://zouqingyun.blog.51cto.com/782246/1882367 一.简述 这几天在 ...

  8. 一致性hash理解

    在做memcached分布式集群时往往要用到一致性hash算法来调节缓存数据的分布. 通常的hash算法是以服务器数量N作为模数,使用key%N的值来获得最终位置,显然当服务器数量发生变化即N发生变化 ...

  9. java版云笔记(九)之动态sql

    SQL 首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程. 静态S ...

  10. ireport报表制作, 通过节点、产品类型来判断,当该节点审核通过之后,报表相对应的审核意见及签名 显示相对应的内容

    1.代码①  (与本内容相关的代码:7~36)           以下类似 $P{P_XXXX} :均为页面端的传入参数 select so.sale_order_no as sale_order_ ...