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

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

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

  第一种点光源叫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. CF1143C Queen

    CF1143C Queen 开始想大力维护 \(bfs\) 序+数据结构解决,但 \(bfs\) 序的变化不太好推. 换了一个思路,注意到删除一个点后,原来可以被删除的点仍然可以被删除,原来不能被删除 ...

  2. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

  3. O​r​a​c​l​e​ ​D​a​t​a​b​a​s​e​ ​e​x​p​r​e​s​s​ ​1​1​g​ ​第​ ​2​ ​版​安​装和配置

    官方Oracle Database 快捷版 11g 第 2 版的下载地址: http://www.oracle.com/technetwork/cn/products/express-edition/ ...

  4. 安装wamp 缺少msvcr100.dll

    在一台新电脑上安装wampsever 这是百度上的解决方案,http://jingyan.baidu.com/article/0320e2c1eb49681b87507ba4.html 本人亲测 第一 ...

  5. jython研究笔记

    jython目前只支持python2,不支持python3. python中使用第三方包的话需要重新设置lib的地址. public void getHtmlByTxt(String path) { ...

  6. java web 程序---内置对象application的log方法的使用

    application的主要方法里,有log方法,是日志文件里可以查看到信息的. 当老师写好代码后,他发现在tomact里的log目录下找不到信息,原因是:我们用myeclipse这个客户端软件,应该 ...

  7. Chrome JS断点调试技巧

    Chrome调试折腾记_(2)JS断点调试技巧 技巧一:格式化压缩代码 技巧二:快速跳转到某个断点的位置 技巧三:查看断点内部的作用范围[很实用] 技巧4:监听事件断点 技巧5:DOM及 XHR监听跳 ...

  8. RPC框架之Thrift分析(转)

    一.简介 1.Thrift是Facebook开发的跨语言的RPC服务框架.随后贡献给Apache开源组织.成为RPC服务的主流框架.   2.特点:  优点:       跨语言,支持java.c/c ...

  9. 33_java之类加载器和反射

    01类加载器 * A.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. * a 加载 * 就是指将class文件读入内存,并为之 ...

  10. 合并SCVMM虚拟机的差异磁盘,并删除那些难以删除的Checkpoints(Shapshots)

    使用Microsoft Data Protection Manager(DPM)有时会造成虚拟机的动态和固定磁盘变成差异磁盘,这个应该与DPM进行差异备份有关,未知原因造成DPM差异备份后无法复原原来 ...