当前位置: 首页 > news >正文

[gdc19]《战神4》中的全局光照技术

[gdc19]《战神4》中的全局光照技术

https://zhuanlan.zhihu.com/p/74569737

[gdc19]《战神4》中的全局光照技术

安柏霖

安柏霖

游戏开发话题下的优秀答主

战神4作为18年的GameOfYear,可以说各种牛逼。

Sony Santa Monica 能够将游戏行业里的旗舰游戏继续推进,并且在品质,设计上都有创新,实属不易。

过程中也是比较曲折,难怪主创看到项目最后成功忍不住泪奔。

这里是全局光照技术的呈现,简单说间接光照在GIVolume+NormalizeEnvMap上终于比较成熟了(《战神4》《蜘蛛侠》都类似做法了),比lightmap有比较明显的优势了,实际应用中完全取代Lightmap比较ok了。

=======愤怒的广告条=========

安柏霖:[招聘贴]Call For HardcoreDeveloper​

zhuanlan.zhihu.com图标

=======愤怒的广告条=========

这里是简要的mindmap,内容不多,但是含金量不错的,对于我们接下来要提升的全局光照方面也颇有启发。

然后这里必须要来一个让我下巴掉地上的东东:战神地图编辑器是在maya里的,木有自己的专属编辑器。。。

GIVolume优劣

这个是作为indirect diffuse lighting的解决方案,之前是用的lightmap,相比lightmap, GIVolume有这些好处:

 

GIVolume作为一个3D光照信息,本身确实比2D的lightmap方方面面光照能力强很多,包括

  • 可以让静态物件,动态物件光照信息更统一(lightmap只能作用在static obj上,动态物件要别的方式来弄,常常不一致)
  • 可以给volume fog,particle这种来打间接光照
  • 可以增强IBL(image based lighting,或者我们常说的EnvMap),给IBL进一步的空间信息,提升光照属性

pipeline优势:

  • 和geometry解耦,lightmap是重要和mesh uv搞飞机真心烦

所以GIVolume最后成为《战神4》的选择,其实也是《蜘蛛侠》和<horizon zero dawn>(感谢

@焖茄子

提供信息)的选择,不知道是不是内部大家沟通的结果,都是sony内部的studio。。。安柏霖:[GDC19]《蜘蛛侠》开发解读(3/4)--Runtime篇​zhuanlan.zhihu.com图标

GIVolume的技术细节

这个就比较直接了:

  • 1m一个voxel的精度来存
  • 美术放置box,box内部就会cook GI
  • 会有漏光的情况,通过normal方向偏移搞定
  • GI里面存2band的SphericalHarmonic系数,和天空的visibility

AO和ambient shadow

战神是用了,ssao+ambient shadow+ao map来达到较好的阴影里的“阴影”效果。

(没有任何ao或者ambient shadow信息)

ssao+ao map(蓝色框里面的)+ambient shadow(红色框里的)

ambient shadow是来自last of us里的。

这里有记录:

https://blog.csdn.net/toughbro/article/details/43876137​blog.csdn.net

 

采样角色的capsule即可,不赘述。

 

IndirectSpecularLighting

捕获IBL就不赘述。

这里和CallOfDuty里做法一样,要做一个normalize(作者很委屈的表示这个是他寄几想出来的)。

call of duty的物理光照内容可以看这里:

https://blog.csdn.net/toughbro/article/details/16927505​blog.csdn.net

 

在战神里是要这样做:

 

  • 把envmap的光照信息做normalize
  • 然后用GI的亮度来做最终的indirect specular lighting

 

这样的理由可以看下图的对比:

可以看到,没有GI信息的时候,IBL带来的反射,在左下有严重的漏光,这是因为indirect specular lighting缺乏空间信息,所以就要从GI中拿。

拿的方式就是 NormalizeEnvMap*GI亮度这样去做。

战神这里总结的很不错:GI提供空间细节,cubemap提供角度细节。

编辑于 2019-07-22

「真诚赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

游戏开发

游戏引擎

战神(游戏 | God of War)

文章被以下专栏收录

安柏霖gamedev

 

安柏霖gamedev

hardcore gamedev

推荐阅读

[gdc19]《战神4》的风力&植被交互系统

[gdc19]《战神4》的风力&植被交互系统

安柏霖

[gdc19]《蜘蛛侠》开发解读(2/4)--工具篇

[gdc19]《蜘蛛侠》开发解读(2/4)--工具篇

安柏霖发表于安柏霖ga...

从3A游戏到实时渲染的动画电影,他们是怎么做到的?

从3A游戏到实时渲染的动画电影,他们是怎么做到的?

三文娱发表于三文娱

你们天天都在说的“祖传引擎”,到底能干嘛?

你们天天都在说的“祖传引擎”,到底能干嘛?

触乐发表于触乐

20 条评论

写下你的评论...

 

  • MaxwellGeng

    MaxwellGeng2019-10-05

    一米一个SH Probe这种精度,在转角的地方很有可能出现那种明显的明暗变化,不知道可不可以在1m^3的立方体空间内做随机位置多采几张Cubemap多算几次SH然后平均呢?如果没有很随机的实时灯光变化,这种烘焙时增加采样的方法是不是可行呢?

  • Dr Evo

    Dr Evo2019-07-25

    根本看不懂! 但没关系, 因为是战神, 有奎爷就有赞👍\(≧▽≦)/

  • 招招

    招招2019-07-22

    sony第一方貌似maya直接内接引擎渲染器当编辑器是标配,顽皮狗、教团1886都是。

  • Key Zhang

    Key Zhang2019-07-22

    看起来不如全境封锁的那个牛逼,不过根据gi采ibl很有意思

Ragnarok

Ragnarok回复Key Zhang2019-07-22

一样的,只不过division是动态算(basis不是sh,而是六个方向),spiderman他们是静态bake sh,效率和质量可能更好,但是不支持tod天气效果等

Key Zhang

Key Zhang回复Ragnarok2019-07-22

是的,战神偏线性所以可以全bake,蜘蛛侠这种不用实时的比较奇怪,不知道是不是有什么特殊处理,还是单纯就是多bake几套[好奇]

  • 大萨比

    大萨比2019-07-21

    没什么好委屈的吧。我也是自己想到了以后才看到别人的。COD在算法已经改进了三代,UE4也有自己的混合方法。

  • miccall

    miccall2019-07-21

    这个givolume和UE的light propagation volume一样吗?

miccall

miccall回复安柏霖 (作者) 2019-07-22

那请问一下,UE中相关的功能是什么呢?有没有相关资料?

安柏霖

安柏霖 (作者) 回复miccall2019-07-22

不一样,ue里也有volume概念,但是是用来控制lightmap范围的,light propagation volume和这个做法也是不一样。

  • CGBull

    CGBull2019-07-21

    用Gi强度去控制反射强度么。

安柏霖

安柏霖 (作者) 回复CGBull2019-07-22

yeah

  • 焖茄子

    焖茄子2019-07-21

    作为 17 年的 game of year, 大家应该会对他家用的技术有信心

GuardHei

GuardHei回复焖茄子2019-07-22

18年的

  • 焖茄子

    焖茄子2019-07-21

    其实地平线也用了 gi volume, 这篇文章的 lighting 章节有讲到: https://80.lv/articles/horizon-zero-dawn-interview-with-the-team/

安柏霖

安柏霖 (作者) 回复焖茄子2019-07-22

好文章,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 5 种避免使用 C# lock 关键字的方法
  • [玩转UE4动画系统>功能模块] 之 Advanced Locomotion System V4 的工具函数及工具宏详解
  • Lua5.4新特性
  • 探究光线追踪技术及UE4的实现 -- good
  • Unity游戏项目性能优化总结
  • 【UE4源代码观察】观察DDC(DerivedDataCache)
  • Chrome 抓包
  • float.Parse 在不同区域小数表示是不一样的
  • C# GC 垃圾回收
  • Android Studio NDk调试(基于gradle-experimental插件与LLDB)
  • android studio调试c/c++代码
  • 在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?
  • Visual Studio 2019 远程调试工具(Remote Debugger)使用方法
  • Windbg使用说明书
  • 使用Windbg查看CrashDump
  • 77. Combinations
  • Android Volley源码解析
  • C++入门教程(10):for 语句
  • Debian下无root权限使用Python访问Oracle
  • IP路由与转发
  • javascript 总结(常用工具类的封装)
  • Java深入 - 深入理解Java集合
  • java正则表式的使用
  • Median of Two Sorted Arrays
  • Python连接Oracle
  • spring boot下thymeleaf全局静态变量配置
  • 读懂package.json -- 依赖管理
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端性能优化——回流与重绘
  • 前嗅ForeSpider中数据浏览界面介绍
  • 设计模式走一遍---观察者模式
  • 自动记录MySQL慢查询快照脚本
  • HanLP分词命名实体提取详解
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $L^p$ 调和函数恒为零
  • (1)(1.11) SiK Radio v2(一)
  • (Note)C++中的继承方式
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (SpringBoot)第二章:Spring创建和使用
  • (windows2012共享文件夹和防火墙设置
  • (三)mysql_MYSQL(三)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)负载均衡,回话保持,cookie
  • (转载)(官方)UE4--图像编程----着色器开发
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET MVC第五章、模型绑定获取表单数据
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET6 命令行启动及发布单个Exe文件
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递