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

  光源:方向光,点光源,聚光灯。但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度(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. @Transactional、Spring的声明式事务

    传送门 一.Spring的声明式事务 需要在xml文件中配置 <!--配置事务管理器类--> <bean id="transactionManager" clas ...

  2. Tomcat启动 Unable to process Jar entry [javassist/XXXXXX.class]

    例如: 03-Mar-2017 17:01:45.864 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.startup.Co ...

  3. 6-11 Level-order Traversal(25 分)

    Write a routine to list out the nodes of a binary tree in "level-order". List the root, th ...

  4. pandas groupby 使用

    so useful~ refer to: http://kekefund.com/2016/06/17/pandas-groupby/

  5. web程序1

  6. kafka速度为什么快

    1. kafka 使用了 分区.分布式.leader/followere 的方式.分布式让 kafka 排除了单点故障,分区和分区复制让数据不丢失2. kafka 使用 zero copy 技术 (基 ...

  7. 异步编程 In .NET(转载)

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  8. 智能家居入门DIY——【二、LD3320之语音识别】

    前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...

  9. node使用JsonWebToken 生成token,完成用户登录、登录检测

    最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...

  10. VS2015 Git 源代码管理工具使用记录

    1. 首先到源代码托管平台申请个账户:https://git.oschina.net/ 2.创建流程图: 2.1 开始创建项目: 2.2 3. 4.