对于真是世界的渲染,有三个重要的组成部分,光源,材质,以及摄像机。下面,我们一个一个来简单介绍一下。

  光源:方向光,点光源,聚光灯。但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度(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》第三版 第五章的更多相关文章

  1. Java 线程第三版 第五章 极简同步技巧 读书笔记

    一.能避免同步吗? 取得锁会由于下面原因导致成本非常高:     取得由竞争的锁须要在虚拟机的层面上执行很多其它的程序代码.     要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 ...

  2. PNP管理器简析--基于ReactOS0.33

    CSDN上转悠了一圈发现关于PNP管理的文章不多.那就由我献个丑,记录自己对PNP管理器的看法. pnp管理器被描写叙述为向内核和应用程序提供关于设备拔插的通知,凭感觉,pnp管理器应该是个线程函数等 ...

  3. 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析

    写着前面 IdentityServer4的学习断断续续,兜兜转转,走了不少弯路,也花了不少时间.可能是因为没有阅读源码,也没有特别系统的学习资料,相关文章很多园子里的大佬都有涉及,有系列文章,比如: ...

  4. 3D文件压缩库——Draco简析

    3D文件压缩库——Draco简析 今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析. 注:Draco 代 ...

  5. 简析.NET Core 以及与 .NET Framework的关系

    简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...

  6. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

  8. AFNetworking封装思路简析

    http://blog.csdn.net/qq_34101611/article/details/51698473 一.AFNetworking的发展 1. AFN 1.0版本 AFN 的基础部分是 ...

  9. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

随机推荐

  1. BZOJ1835: [ZJOI2010]base 基站选址【线段树优化DP】

    Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...

  2. ballerina 学习二十 http/https

    提供http && https server && client 访问功能 client endpoint 说白了就是http client 参考代码 import b ...

  3. PCB 设计文件中哪些可以不做成元件

    PCB 文件中哪些可以不做成元件 在 PCB 设计时有些元件为了快速,实际并不需要做成元件. 因为做成元件会浪费时间,并且生产时也没有实际的元件. 如下(持续更新): PCB 与 PCB 之前的连接人 ...

  4. Phonegap中插件管理

    一.cordova-plugin-console控制台插件的使用 1.进入工程路径后,输入如下命令: cordova plugin add cordova-plugin-console 2. 查看插件 ...

  5. 安全关闭MySQL

    想要安全关闭 mysqld 服务进程,建议按照下面的步骤来进行: 0.用具有SUPER.ALL等最高权限的账号连接MySQL,最好是用 unix socket 方式连接: 1.在5.0及以上版本,设置 ...

  6. JSON数组对象某个属性值查找

    1.引用国外开源Linq写法的js框架 地址:https://archive.codeplex.com/?p=jslinq https://www.nuget.org/packages/jslinq ...

  7. 根据给定文件编写Makefile文件 两种方法编译

    实例一 1.分析源文件代码依赖关系 mian.c #include "test1.h" #include "test2.h" #include <stdi ...

  8. 学习笔记之Tips for Macbook

    写给Mac新手的入门指南 - 威锋网 https://mp.weixin.qq.com/s/pqmqGZhNwevx57KeLnzZmg https://bbs.feng.com/read-htm-t ...

  9. PHP分多步骤填写发布信息的简单方法实例代码

    1.php 复制代码 代码如下: <form name=form1 id=form1 method=post action=2.php> 基本信息1:<input type=text ...

  10. 8 ways to improve ASP.NET Web API performance

    ASP.NET Web API is a great piece of technology. Writing Web API is so easy that many developers don’ ...