我们这里讨论的光源类型都有一个相同点,就是,我们考量的都是光源上的一个点,对于物体表面上一个点的影响,也就是说立体角趋近为零的情况。

  这里光源分为两类,一类是方向光,假设光源在无限远处。另一类是点光源,假设光源的大小相对与光源和物体表面的距离可以忽略。

  方向光在前面介绍过了,它的对物体的辐照度是不变的。现在来把点光源细分一下。

  第一种点光源叫omni light,泛光体。它的特点是光源向各个方向的辐射强度或者光的强度都是一样的。在计算其对物体表面辐照度影响的时候使用如下方程:

  

  其中,Pl是光源的位置,Ps是物体表面的位置。可以看出,辐照度是随着物体表面和光源距离的平方的增加而减少的。其中第三个方程就是物理中辐射强度和辐照度的计算公式,这里的辐照度是和光线垂直的表面的辐照度,这也是很多光照计算中为什么有距离平方的倒数这种变量的原因。实际计算中通常只来计算一个系。由一种叫做衰减方程(falloff function)来代替上式中的分母,如下:

  之所以使用一个方程而不是使用r的平方,是为了更好的控制渲染的效果。同时,能够处理一些极端的情况,比如,物体如果和光源的距离十分接近,以及十分远的时候。一下三种方程都是衰减方程的实际形式。

  第一个方程是OpenGL和DX固定流水线实现的方程。第二个是在实时渲染中广泛使用的方程,其中rs和re是自己设定的,便于控制效果。第三个方程是Pixar在电影渲染中所使用的一种方程。对于第三种方程,rc是一个常量,用来描述和光源距离相关的常量,让r越接近光源时,整个方程越接近fmax,而当光源越来越远离时,通过se来实现一个更好对方程结果的控制,另外两个常量k0=ln(fc/fmax),k1 = se/k0,这个方程来自Barzel的一篇1997年的论文。到此,泛光源就介绍完了。

  第二中点光源叫做spot light ,聚光灯。它就是光照强度随着方向的改变而改变的一种光源。其中一种变化形式是根据光源方向和光线方向(光源位置到物体表面的向量,这个在前面的介绍中,为了在光照方程中能更快速的计算出光线和法线的夹角,所以一直方向一直是从物体表面到光源位置的单位向量,这里,我们要反过来)的夹角来衰减光照强度,例如一下方程,这个方程也是OpenGL固定流水线中使用方程,

  通过上述方程计算出光照强度后,利用以上的方程7.12或者衰减方程来计算辐照度。但是在DX固定管线中提供的是如下方程,这个方程的特点是能够模拟出本影(umbra)和半影(penumbar),其中参数的意思,一看就知道了,这里不多说了,

  下面介绍第三种点光源,textured light ,纹理映射光源。如果知道Shadow Map原理的话,那么这种光源是十分好立即的,如果不知道,请参考本博客中相关文章。就结果来说,Textured Map的效果如下图:

                                 

  就是把实现Shadow Map时的深度纹理替换成一张二维纹理,这样计算像素时,直接混合纹理和像素已有颜色就可以了。

advance shading--光源的类型的更多相关文章

  1. advance shading——基础(辐射度测定)

    辐射度测定(radiometry) <real time rendering>在这章上来就说了一大堆光照方面的物理术语,不知该怎么翻译.后来在维基百科上看到这个表,清楚了很多(这里的w是瓦 ...

  2. advance shading——菲涅耳现象

    (计算光照的时候,从两点出发考虑,光的传播方向,以及光的在这个方向上的能量.) 光与表面交互的模型包含两类:和物体表面(surface)以及和物体的内部(body).而subsurface指的是在物体 ...

  3. advance shading--BRDF

    其实,双向反射(reflect)分布函数(BRDF)是一个四元函数,这个函数最终只是计算一个比值,这个值确定了射入物体表面的光中有多少被物体表面反射,并最终被眼睛所看到.反射的愈多,眼睛收到的光强越大 ...

  4. Unity 渲染教程(五):多个光源

    https://www.jianshu.com/p/c1a9a5d27765 对每个物体渲染多个光源的光照效果. 支持不同的光源类型. 使用光源cookie. 计算顶点光照. 在光照计算中添加球面谐波 ...

  5. Shader预处理宏、内置状态变量、多版本编译等

    预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D SHADER ...

  6. matlab的三维绘图和四维绘图

    一.三维绘图1.曲线图plot3(X1,Y1,Z1,...):以默认线性属性绘制三维点集(X1,Y1,Z1)确定的曲线plot3(X1,Y1,Z1,LineSpec):以参数LineSpec确定的线性 ...

  7. Unity Shader 入门精要学习 (冯乐乐 著)

    第1篇 基础篇 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader 基础 第4章 学习Shader所需的数学基础 第2篇 初级篇 第5章 开始Unity Shad ...

  8. 剖析虚幻渲染体系(12)- 移动端专题Part 1(UE移动端渲染分析)

    目录 12.1 本篇概述 12.1.1 移动设备的特点 12.2 UE移动端渲染特性 12.2.1 Feature Level 12.2.2 Deferred Shading 12.2.3 Groun ...

  9. Unity3D脚本中文系列教程(十)

    http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...

随机推荐

  1. Promise的并行和串行

    Promise 并行 这个功能Promise自身已经提供,不是本文的重点.主要是依赖Promise.all和Promise.race. Promise.all是所有的Promise执行完毕后(reje ...

  2. 数据库Job定时任务

    数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作.但是,Oracle定时器Job时间的处理上,千变万化,今 ...

  3. HDU 3973 AC's String 字符串哈希

    HDU 3973 通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要 ...

  4. python 获取excel文件内sheet名称列表

    xl = pd.ExcelFile('foo.xls') xl.sheet_names # see all sheet names xl.parse(sheet_name) # read a spec ...

  5. spring下的多线程

    链接 1,http://haidaoqi3630.iteye.com/blog/1920944 2,http://www.importnew.com/27440.html .............. ...

  6. [C++ Primer] 第9章: 顺序容器

    顺序容器概述 顺序容器的类型有: 类型 说明 vector 可变长度数组. 支持快速随机访问. deque 双端队列. 支持快速随机访问. list 双向链表. 只支持双向顺序访问. forward_ ...

  7. 简单桶排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...

  8. Beautiful and Powerful Correlation Tables in R

    Another correlation function?! Yes, the correlation function from the psycho package. devtools::inst ...

  9. java中的变量和常量

    也可以先声明后赋值  自动类型转换 1.  目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型 2.  目标类型大于源类型,如 double 类型长度 ...

  10. wchar_t char string wstring 之间的转换

    wchar_t char string wstring 之间的转换 转:http://blog.csdn.net/lbd2008/article/details/8333583 在处理中文时有时需要进 ...