光源 材质 简析——基于《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,同时具有序列化.发序列化机制:当我们开 ...
随机推荐
- pidgin-lwqq
今天第一次用pidgin登上了qq,好神奇. 从网上看到的,说是pidgin发布了支持webqq协议的lwqq,按照解释之后安装了. 感觉好神奇啊. 一个绿色的小企鹅^^ 今天有看到了一个大牛,我觉得 ...
- debian 安装deb软件
deb包 deb包是debian,ubuntu等LINUX发行版的软件安装包,是类似于rpm的软件包,而非debian,ubuntu系统不推荐使用deb软件包,因为要解决软件包依赖问题,安装也比较麻烦 ...
- java面试题7
1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...
- Jenkins搭建.NET自动编译发布远程环境
继上一篇文章Jenkins搭建.NET自动编译发布本地环境 发布到本地成功后,接下来配置发布到远程环境. Build配置——发布到远程 根据前面VS中发布项目,生成的CustomProfile2 来配 ...
- ios开发之-windows下面虚拟机运行osx,以及xcode
下载vmware osx镜像 https://kickass.to/os-x-mavericks-10-9-retail-vmware-image-t7981468.html (还有个链接下载不了ht ...
- bzoj 3924 [Zjoi2015]幻想乡战略游戏——动态点分治(暴力移动找重心)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3924 度数只有20,所以从一个点暴力枚举其出边,就能知道往哪个方向走. 知道方向之后直接走到 ...
- 02 - Unit04:笔记本加载功能
@ExceptionHandler 在控制器中统一处理异常. 为了重用异常处理方法,可以将处理方法抽象到父类中,子类共享异常处理方法. 语法: @ExceptionHandler(Exception. ...
- springMVC等小知识点记录。。。持续更新
1.springMVC 项目根路径访问页面配置 <!-- 表示当访问主页时自动转发到index控制器 --> <mvc:view-controller path="/&qu ...
- Air test 基于屏幕比例实现滑动的方法
# -*- encoding=utf8 -*- __author__ = "chenshanju" __docs__ = "基于iOS类实现滑动" from a ...
- Ubuntu 中安装 Docker
检查 Device Mapper 是否存在 sch01ar@ubuntu:~$ ls -l /sys/class/misc/device-mapper 安装 Ubuntu 维护的版本 sch01ar@ ...