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

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

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

  第一种点光源叫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. springboot整合mybatis增删改查(三):mybatis逆向工程

    上一篇已经把项目基本框架完善,接下来就是利用Mybatis Generator逆向工程进行mybatis的整合. 我们在创建项目开始的时候已经勾选web,mybatis,sql等,但是这些依赖还是不够 ...

  2. 都是用 DllImport?有没有考虑过自己写一个 extern 方法?

    你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的.这种 DllImport 标记的方法都带有一个 ...

  3. java阳历转农历

    package com.reading.task; import java.text.ParseException;import java.text.SimpleDateFormat;import j ...

  4. streamsets mongodb destinations 使用

    测试集成了directory(excel) 以及redis && field splitter 组件 pipeline flow docker-compose 配置 redis 服务& ...

  5. nexus yum 私服集成

      nexus 集成了 yum 私服使用起来还是比较简单的 配置 yum proxy 实际使用我们可能需要配置centos 以及epel 的源 centos可以用http://mirror.cento ...

  6. sysbench 测试mysql性能

    ===== #1sysbench --test=oltp --oltp-table-size=10000 --mysql-db=test --mysql-user=root --mysql-passw ...

  7. python-web 创建一个输入链接生成的网站

    第一步:写一个自定义程序 #coding=utf-8 import os #Python的标准库中的os模块包含普遍的操作系统功能import re #引入正则表达式对象import urllib # ...

  8. mysql-4连接

    联合多表查询 菜鸟教程join 日常应用较多的是从多个表格中获取数据.使用join可以在多个表查询进行select.update.delete. join按照功能分为三类: inner join(内连 ...

  9. jQuery的删除的三种方法remove(),detach(),empty()

    remove()方法是从DOM中删除所有匹配的元素,包括匹配元素的子元素.但是他会有一个返回值, 返回值是一个指向已被删除的节点的引用,所以说,remove删除的元素,还可以再回收利用. var $l ...

  10. 记一次全站升级https引发的一系列问题

    中秋假期,闲来无事.花了一下午折腾了下https,说实话这年头还有网站不上https显然是折腾精神不够啊~ 1.SSL证书评估 看了市面上各种类型的证书,有收费的也有免费的,但是最终还是选择了腾讯云提 ...