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

  光源:方向光,点光源,聚光灯。但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度(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. Jmeter-Logic Controllers(逻辑控制器)

    Critical Section Controller(临界区控制器) 参考:http://www.cnblogs.com/yanzhe/p/7729984.html ForEach Controll ...

  2. 常见HTTP状态码(200、301、302、500等) 释义

    对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码.状态码的第一个数字代表了响应的五种状态之一. 1XX系列:指定客户端应相应的某些动作,代表请求已 ...

  3. [BZOJ3162]独钓寒江雪

    bzoj description 你要给一个树上的每个点黑白染色,要求白点不相邻.求本质不同的染色方案数. 两种染色方案本质相同当且仅当对树重新标号后对应节点的颜色相同. \(n\le 5\times ...

  4. CH3301 同余方程

    题意 3301 同余方程 0x30「数学知识」例题 描述 求关于 x的同余方程  ax ≡ 1(mod b) 的最小正整数解. 输入格式 输入只有一行,包含两个正整数a,b,用一个空格隔开. 输出格式 ...

  5. 三:背包DP

    01背包问题描述 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]. 限制:每种物品只有一件,可以选择放或者不放 问题:在不超过背包容量的情况下,最多能 ...

  6. Java多线程编程核心技术,第四章

    1,ReentrantLock 2,object的wait(),wait(x),notify(),notifyAll(),分别等于Condition的await(),await(x,y),signal ...

  7. zipkin:和springcloud集成过程记录

    发现全是springcloudapp的名称,然后是springcloudapp(http://localhost:8080/hello/tom)工程单独调用并没有通知zipkin: 原来是因为rest ...

  8. Linux内核 TCP/IP参数调优

    http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml

  9. netty基本组件介绍

    Netty做为一款用于搭建高性能网络应用程序的高级框架,由以下几个主要构件组成: 一.Channel Channel 是java NIO的一个基本构造,可以把channel看作是传入或者传出的数据载体 ...

  10. 02 - Unit011:Spring AOP

    Spring AOP 面向切面(儿)编程(横切编程) Spring 核心功能之一 Spring 利用AspectJ 实现. 底层是利用 反射的动态代理机制实现的 其好处: 在不改变原有功能情况下, 为 ...