Lighting Techinology of the Last Of Us (2013 SIGGRAPH)
Lighting Techinology of the Last Of Us(2013
SIGGRAPH)
or "Old Lightmaps - New Tricks"
原作:Michal lwanicki
本篇主要讲述 The Last of Us中用到的用到的光照技术,以及解决问题的思路,原作者wanicki是 顽皮狗的引擎工程师,同时也参与了RealTime Rendering 4th的编写。
ppt 原文链接[http://miciwan.com/SIGGRAPH2013/Lighting%20Technology%20of%20The%20Last%20Of%20Us.pdf]
同时也要感谢下工作室大佬的解惑。
目录
- 一.背景介绍
- 二.最小二乘降低误差
- 三.Lightmaps
- 四.出现的问题和解决方法
- 五.优化方法
- 六.结论
一.背景介绍
由于游戏发生在后世界末日,几乎没有电,所以没有人造光源。大部分的光线来自太阳和天空,所以大部分的环境都是由反射光照亮的。
有一个非常强大的艺术方向:我们想展示这个灯光的美丽,它的柔和,它如何在不同表面之间传播,它创造的柔和阴影。我们想显示间接光照的镜面反射高光,并显示用普通的normal map展示细节。
首先展示一下我们想要达到的效果
如图所见,所有的光线都很柔和,但同时表面细节也表现的很到位。
为了实现这样的效果,目前机器性能实时渲染是吃不消的,所以我们使用了预计算的光照贴图。虽然光照贴图应用了这么多年,但是还是存在一些根本性的问题。
二.最小二乘降低误差
接缝:在三维空间中相邻的区域,映射到UV空间中时,可能在不同贴图的相交区域,如果沿分割线做插值的话,不完全匹配就会产生明显的接缝。
(打个比方一个圆柱沿竖线剪开,展uv,竖线2侧在三维空间中可能是连续的,但是uv空间展开之后不连续)
常见解决方法:在运行时,花费额外的开销,去减弱接缝,或者对物体在uv空间中的位置做一些限制。
为什么没有用在The Last Of Us中:美术的体量不匹配,不适合当前的项目,效率低下,成本太高,无法集成到项目的管线中。
我们发现,我们的主要矛盾就是接缝两侧插值不匹配的问题,所以我们通过了修改边缘纹理的强度,来让他们匹配起来
如上图所示的例子,先介绍下概念,绿色和紫色是空间中的2个mesh,红点虚线是分割边,在这个分割边上,取了很多个点,Ci0表示绿色mesh中i点相邻4个像素的 插值, 在紫色mesh中同样有一个点Ci1,如果Ci0 = Ci1 最好,我们把同一个点在相邻mesh上的误差定义为他们的平方差
\[\ C_{i0}= \sum_{j}^{4}{W_{0ij} * T_{0ij}}\]
\[\ C_{i1}= \sum_{j}^{4}{W_{1ij} * T_{1ij}}\]
\[E_i = (C_{i0} - C_{i1})^2 \]
整个光照贴图的误差函数,就是各个点的误差之和。
当有了误差函数之后,使用最小二乘法,把纹理的值作为变量,优化过程,通过修改texel的值,确保误差最小,为了确保最后的结果不偏离最初计算的值,引入了一个约束惩罚计算值的偏离,这个值用户可以调配。
好处
- 不用对UV布局进行更改
- 没有额外的运行开销
- 并且这种方法可以用在其它类型的贴图边缘融合
一些注意事项
- DXT压缩会打破一些精度,大多数情况看不出来,看起来是正常的,
- 不要自己写 线性解算器,有一些现成的轮子[Eigen]
额外补充
如果你仔细观察,就会发现,最小二乘最小化,其实在其它很多地方用到过。比如游戏游戏中 3D LUT(Look Up Table,直译过来就是查找表的意思。所以LUT的本质就是输入一个特定的值转化为一个对应的输出值)管线的颜色校正,流程如下
- 截图
- 在图片中嵌入问题
- 在Photoshop中演算
- 提取LUT
- 在游戏中,渲染场景,提取LUT
比较的结果可能是,有严重的变色,这时候误差函数被定义为两幅图片中的平方差,通过修改volume texture 使误差最小,会取得一个比较好的结果。
LUT扩展阅读(https://zhuanlan.zhihu.com/p/37717976)
三.Lightmap 新的表达
回到灯光中,我们希望在没有直接光照的情况下,避免表面平坦,所以光照贴图中须要包含光照的方向信息。
我们评估了不同的方案,HL2(半条命)的Radiosity Normal Mapping,用6个方向的vec3来记录光照信息。(https://drivers.amd.com/developer/gdc/D3DTutorial10_Half-Life2_Shading.pdf)。
好处是相比SH(Sphere harmonic),计算量会稍微少点,但是用在曲面上,因为是插值的原因,细节丢失的会多一点。
目前2018年UE4和unity都用上了SH。
最后选择了一个简单的方案,为每个光照贴图 同时存储Ambient(环境光)和Directional(方向光)。
通过使用 “环境光” + ”方向光” 的方案,有几个好处
- 1.美术能很好的理解 烘焙结果的输出
- 2.某种意义上方便直接上手调整效果
- 3.通过主光源的方向信息,可以创作一些额外的效果
对于光照贴图的每个texel纹理,烘焙工具会有光照发布的信息,我们分为2个组件
- 环境光部分: 为单一颜色,各个方向强度相同
- 方向光部分: 包含一个反方信息和颜色信息(这里的颜色为,光在方向的强度)
我们通过GI bake 的工具生成了SH(球谐函数sphere harmonics) lightmap,通过这样的方式(环境光+方向光)表示最终的效果。
\[I = C_{amb} + C_{dir} * max((\vec
N,\vec L),0 )\]
通过这种表达方式,还可以表示表面的高光。
四.出现的问题和解决方法
看看效果,感觉还不错。
虽然理想很美好,但是当我们添加了人物之后,有点蹦。
人物看起来很奇怪,为什么呢,因为人物在与环境交互的时候,会产生阴影,看起来是环境的一部分,而上图却没有。
通过查阅一些资料,我们在sh指数化的论文中得到了灵感,用一组球体来近似遮光罩,并通过将它们以一种奇特的方式相乘,结合被描述为sh向量的可见性函数。
问题是要得到满意的阴影,需要高的sh阶。斯蒂芬·希尔在《分裂细胞》中用二阶sh对AO做了类似的事情。
我们的优势
- 结构简单,只有一个环境光部分和方向光部分,不用关心得到整体的可见性函数,可以分开2个部分的表示
- 对每个部分,球面上的点,计算遮挡
- 对于环境光部分,计算单位球在半球面遮挡的cos的加权百分比
- 对于方向光部分,从目标点往球面创建一个圆锥体,检查光照方向和半球面的交叉点
接下来是一些技术细节
- 对于环境分量,有一个近似的解决方案,直接计算立体角的cos和整个半球cos的比值
- 对于方向分量,是哟给你蒙特卡洛进行预计算,对于给定的圆锥叫 theta,将采样区域概率密度 转化到 接受点立体角的概率密度
raytrace one week 第三本 和pbrt14.6章 都有介绍。(https://computergraphics.stackexchange.com/questions/4288/path-weight-for-direct-light-sampling)
圆锥的角度是可以调整的,可以让美术来控制阴影边缘的大小,
五.优化方法
使用SPU渲染到缓冲区
先通过使用SPU(主机平台的一种流处理器单元)去渲染阴影到缓冲区,GPU在渲染的时候,从缓冲区中读数据,再最终渲染出结果。
4-5个角色差不多要6-7ms,但是用了这种方法,代理分割到6个SPU单元,2ms就搞定了。
使用低模代理去计算阴影
这样可以很好的提高运算效率,在测试场景中,模型精度讲到1/4,计算得到的阴影基本很难看出区别,非常有效。
六.结论
- 预计算光照还可以发光发热
- 一些tricks可以使画面更好
- 记得使用最小二乘
- 不要自己写线性解算器
参考文献
- [Eigen] Eigen library: (http://eigen.tuxfamily.org/index.php?title=Main_Page)
- [McTaggart2004] "Half-Life 2/Valve Source Shading",Gary McTaggart
- [Good2005] "P[timized Photon Tracing Using Spherical Harmonic Light Maps", Otavio Good and Zachary Taylor
- [Ren2006] "Real_time Soft Shadows in Dynamic Scenes using Spherical Harmonic Exponentitaion", Zhong Ren et al.
- [Sloan2007] "Image-Based Proxy Accumulation for Real-Time Soft Global Illumination", Peter-Pike Sloan et al.
- [Hill2010] "Rendering with Conviction", Stephen Hill
- [Oat 2006] "Ambient Aperture Lighting", Christopher Oat and Predro V. Sander
Lighting Techinology of the Last Of Us (2013 SIGGRAPH)的更多相关文章
- Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH)
Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH) 在2011的SIGGRAPH上,NVIDA提出了FXAA3.1,本文主要 ...
- Godaddy主机从购买到开通的详细图文教程(2013年)
http://bbs.zhujiusa.com/thread-10-1-1.html Godaddy主机从购买到开通的详细图文教程(2013年最新) Godaddy是全球域名注册商中的NO.1,同时也 ...
- IT农民的开发人员工具清单(2013年)
IT行业日新月异,每天都不断变化着.作为一名混迹IT行业小有几个年头码农来说,不仅要时刻提高自身技术,也要不断更新自己开发工具.这些工具都是我吃饭的饭碗.饭碗旧了也是需要买个新的.转眼之间,已到201 ...
- Patchwork(2013年)--CNV检测方法流程
文章题目:Patchwork: allele-specific copy number analysis of whole-genome sequenced tumor tissue 特点: 可以检测 ...
- python基础学习(十二)
模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...
- python基础学习笔记(十二)
模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...
- 【Unity Shaders】Diffuse Shading——创建一个自定义的diffuse lighting model(漫反射光照模型)
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Unity Lighting - The Precompute Process 预计算过程(二)
The Precompute Process 预计算过程 In Unity, precomputed lighting is calculated in the background - eith ...
- UVa 11400 - Lighting System Design(线性DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- [转帖]关于USB3.0以及type-C
忘记来源页面了.. 但是昨天晚上 usb 4.0 发布了 跟雷电C 安全一样的标准 双向40gb 的带宽. 而且 以后只有usb type-C的接口了. 我们办公机器上面的 typeC 同事用 ngf ...
- PostgreSQL练习
学生表 Studentcreate table Student(Sid varchar(6), Sname varchar(10), Sage datetime, Ssex varchar(10)); ...
- 【第一季】CH04_FPGA设计Verilog基础(一)Enter a post title
[第一季]CH04_FPGA设计Verilog基础(一) 4.1 Verilog HDL 代码规范 u 项目构架设计 项目的构架用于团队的沟通,以及项目设计的全局把控 u 接口时序设计规范 模块和模块 ...
- 社工工具包 SEToolkit
社会工程学(Social Engineering)简称社工,其通过分析攻击对象的心理弱点,利用人性的本能反应,以及任何好奇心,贪婪等心理特征进行的,使用诸如假冒,欺骗,引诱等多种手段来达成攻击目标的一 ...
- 牛客 26E 珂学送分2 (状压dp)
珂...珂...珂朵莉给你出了一道送分题: 给你一个长为n的序列{vi},和一个数a,你可以从里面选出最多m个数 一个合法的选择的分数定义为选中的这些数的和加上额外规则的加分: 有b个额外的规则,第i ...
- IoC(Inversion of Control 控制反转)
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...
- Angular6如何引入jQuery-knob
Angular6如何引入jQuery-knob 1.概述 Angular6引入jQuery变得异常简单,请参考https://blog.csdn.net/qq_35321405/article/det ...
- 如何演讲-摘录自TED
一.首先,只传递一个主要思想 想法是个很复杂的东西,你要对你的内容做减法,突出重点,只关注一个主要思想,也就是你最富有热情的观点,利用机会好好的阐述它.你要给出案例,分享案例,生动阐述所以,找到一个 ...
- 设计模式 -- MVC
MVC 在Web中应用是常见的了,成为基础应用模式. 不好的用法是把业务写在C 中,M只是失血模型. 应该要重M 轻C,业务写在M中,但是这样有问题了.View 会引用Model,那么View会看到M ...
- linux 安装redis 完整步骤
最近在linux服务器上需要安装redis,来存放数据,增加用户访问数据的速度,由于是第一次安装,于是在百度上搜了一篇文章,按照这篇博客,顺利安装好了,因此将博主的文章拷过来记录一下,方便以后使用,也 ...