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

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

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

  第一种点光源叫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. 转:MyISAM 和 InnoDB 讲解

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISA ...

  2. LOJ10131. 「一本通 4.4 例 2」暗的连锁【树上差分】

    LINK solution 很简单的题 你就考虑实际上是对每一个边求出两端节点分别在两个子树里面的附加边的数量 然后这个值是0第二次随便切有m种方案,如果这个值是1第二次只有一种方案 如果这个值是2或 ...

  3. 第2本MATLAB书

    前面看的<DSP using MATLAB>后面还有两章,其内容太难了,看不下去,暂时放放: 因为工作中需要MATLAB和电磁场的相关知识,从网上找了本 初步翻了翻,里面有代码有图片,英文 ...

  4. [LOJ6198]谢特

    loj description 给你一个字符串和一个数组\(w_i\),定义\(\mbox{LCP}(i,j)\)为\(i,j\)两个后缀的最长公共前缀.求\(\max_{i,j}\mbox{LCP} ...

  5. VUE的使用方法

    vueInit: function() { var _this = this; this.vue = new Vue({ el: '#pa', data: { //存放初始化数据 sourceData ...

  6. prisma graphql 工具基本使用

    项目使用docker-compose mysql 运行 安装 npm insatll -g prisma or yarn global add prisma 创建代码 项目结构 ├── README. ...

  7. IT项目管理工具总结

    IT项目管理工具总结 俗话说"工欲善其事必先利其器",在一个项目开发流程中,如果搭配一个比较完善的项目管理工具,必将取得事半功倍的效果.本文搜集了目前项目管理界比较有规模的管理工具 ...

  8. nyoj A+B Problem IV

    A+B Problem IV 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这 ...

  9. 纯php实现中秋博饼游戏(2):掷骰子并输出结果

    这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...

  10. LR脚本记录

    1. 打印出: the value  is+"参数值" lr_output_message("the value  is",lr_eval_string(&qu ...