光源 材质 简析——基于《real time rendering》第三版 第五章
对于真是世界的渲染,有三个重要的组成部分,光源,材质,以及摄像机。下面,我们一个一个来简单介绍一下。
光源:方向光,点光源,聚光灯。但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度(irradiance)EL的,也就是单位面积上通过光的能量,这个能量由受到光和表面的夹角以及光本身的能量来表示。通常我们用RGB向量三种颜色来表示不同颜色光的辐照度。那么,当光的方向和表面垂直时,单位面积上的辐照度时最大的。当光的方向和表面有夹角时,光的辐照度开始变弱。如下图

可以看出,光的密度一样的时候(图中的d),单位面积上的光线数依赖于光线和法线的夹角的cosin值。注意,在大多数计算过程中,提供的光线的方向和图中的方向时相反的,这样可以直接求解,如果cosin为负值,那么说表面的背面接受光源。因此可的公式:

材质:定义了物体表面和光线交互时的一些特性,比如纹理,shader程序以及其他特性。注意,纹理和材质是有区别的。基本上所有的光线和材质交互的方式可以概括为两类:分散(s cscattering)和吸收(absorption)。
分散是指物体的表面改变光的方向,但是不改变光的能量大小。那么,折射(refraction or transmission)和反射(reflection)都是分散的结果。对于不透明的物体,一部分光线变为反射光线,另一部分光线折射进入物体内部后,又经过分散和吸收,最终从物体内部再次发射出来。
吸收是指光进入物体的内部,从而转化成其他的能量或者消失。
基于以上的分类,渲染方程(shading equations)通常会计算两个系数,镜面系数(specular term 代表了反射光线)和 漫反射系数(diffuse term 代表了进入物体内部分部分)。
和物体表面交互的光照总量成为辐照度,相应的经过和单位面积材质交互后产生的光照总量成为exitance,表示为M。exitance和辐照度的比值对于不同颜色是不一样的,所以经常RGB向量表示三种颜色不同的比值,这个RGB值成为表面颜色surface color C ,这个surface color 包含了 specular color 和 diffuse color 。surface color 依赖于表面的特性,如 钢铁,皮肤,塑料等。因此specular color 和 diffuse color 是物体的特性,根据这两个特性计算specular term 和 diffuse term。
那么有 Mdiffuseterm /EL*cosΘ = Cdiffuse , 那么有 Mdiffuseterm = EL*cosΘ*Cdiffuse ;因为diffuse是向各个方向散发的 所以最终的diffuseterm = Mdiffuseterm/PI ;
这里需要说明的是:辐照度是光照射到表面,还有一个辐射度,是被表面散射出来的光,也可以理解为exitance。
同样的方法也可以用作计算specularterm = Cspecular*EL*cosΘ。计算最后的镜面颜色的公式比较复杂,如下:

其中Θh是半角向量和法线的夹角。注意:以上公式中涉及到两个向量相乘时,时向量的各个元素分别相乘,得到的还是向量,和平常的向量相乘不一样。
光源 材质 简析——基于《real time rendering》第三版 第五章的更多相关文章
- Java 线程第三版 第五章 极简同步技巧 读书笔记
一.能避免同步吗? 取得锁会由于下面原因导致成本非常高: 取得由竞争的锁须要在虚拟机的层面上执行很多其它的程序代码. 要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 ...
- PNP管理器简析--基于ReactOS0.33
CSDN上转悠了一圈发现关于PNP管理的文章不多.那就由我献个丑,记录自己对PNP管理器的看法. pnp管理器被描写叙述为向内核和应用程序提供关于设备拔插的通知,凭感觉,pnp管理器应该是个线程函数等 ...
- 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
写着前面 IdentityServer4的学习断断续续,兜兜转转,走了不少弯路,也花了不少时间.可能是因为没有阅读源码,也没有特别系统的学习资料,相关文章很多园子里的大佬都有涉及,有系列文章,比如: ...
- 3D文件压缩库——Draco简析
3D文件压缩库——Draco简析 今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析. 注:Draco 代 ...
- 简析.NET Core 以及与 .NET Framework的关系
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- 简析TCP的三次握手与四次分手【转】
转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...
- AFNetworking封装思路简析
http://blog.csdn.net/qq_34101611/article/details/51698473 一.AFNetworking的发展 1. AFN 1.0版本 AFN 的基础部分是 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
随机推荐
- UT源码+105032014070
设计三角形问题的程序 输入三个整数a.b.c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形.等腰三角形.一般三角形(特殊的还有直角三角形),以及不构成三角形.(等腰直角 ...
- git操作提交方式
git代码提交 第一次提交代码 在本地建立一个文件夹用来存储代码,相当于一个仓库进入文件夹目录输入下面命令 echo "# xxx" >> README.md (添加一 ...
- pthread中向线程发送信号(pthread_kill )
pthread_kill 语法 int pthread_kill(thread_t tid, int sig); #include <pthread.h> #include <sig ...
- X.509证书的编码及解析:程序解析以及winhex模板解析
一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...
- java websocket @ServerEndpoint注解说明
http://www.blogjava.net/qbna350816/archive/2016/07/24/431302.html https://segmentfault.com/q/1010000 ...
- js复制URL链接
html: <div style="height:0px; text-indent:-10000px;"><span id="hdcopyurl&quo ...
- IDEA 配置Jrebet 自动加载Java类,
官方文档地址: http://manuals.zeroturnaround.com/jrebel/ide/intellij.html#installation 过期激活 https://blog.cs ...
- vlc框架流程解析(转)
原文地址:http://luzefengoo.blog.163.com/blog/static/1403593882012754481846/ 第二部分 程序框架实现 1. 播放列表文件src/pla ...
- css常用属性初总结:伪元素和伪元素
前面几遍中我们分别说到了id选择器和class选择器,以及它们的区别和联系,下面大家一起来探究一下神奇的为类和伪元素吧. 其实以前我对伪类和伪元素也是搞得稀里糊涂的,现在决定剥开它神秘的外衣,首先,究 ...
- python实例、类方法、静态方法
[python实例.类方法.静态方法] 参考:http://blog.163.com/yang_jianli/blog/static/161990006201122411586729/