GAMES104:05游戏引擎中的渲染系统2:渲染中的光照、材质和shader-学习笔记

文章目录

  • 一、渲染方程及其挑战
  • 二、基础光照解决方案-简化版
    • 简化光源
    • 简化材质
    • 简化阴影
  • 三、基于预计算的全局光照
    • 3.1挑战和计算思路
      • 傅里叶变换
      • 球谐函数(Spherical Harmonics)
    • 3.2 SH Lightmap:预计算 GI
    • 3.3 探针 Probe:Light Probe + Refection Probe
      • Light Probe
      • Refection Probe
    • 3.4 基于图像的光照(Image-Based Lighting,IBL)
  • 四,基于物理的材质
    • 4.1 微平面理论
    • 4.2 IBL放到3.4去了,但实际理论与PBR很相近
  • 四,阴影(Shadow)
    • 4.1大世界Cascade Shadow级联阴影
    • 4.2 软阴影
    • 4.3 Virtual Shadow Maps
  • 总结
    • 5-10年前流行的3A配置:
    • 技术展望
    • 过量shader


渲染计算的三大组成部分:Lighting、Material、Shader

一、渲染方程及其挑战

参见闫令琪老师101中:BRDF和渲染方程导论 和 cook-torranceBRDF方程计算

老师认为的图形学的三个挑战:

  1. 对于任一给定方向如何获得radiance–阴影
  2. 对于光源和表面shading的积分运算(蒙特卡洛积分)
  3. 对于反射光多Bounce的无限递归计算

二、基础光照解决方案-简化版

简化光源

  1. 用平行光、聚光灯、点光源作为MainLight 来简化各种光源,用Ambient Light替代光源外的环境光
  2. 用可采样的环境贴图代替反射光线,环境贴图的mipmap代替粗糙度表现

最终结果 = MainLight + Ambient Light+Environment Map

简化材质

在这里插入图片描述

  • Blinn-Phong模型:

基于光可叠加原理(渲染方程中用体现),Blinn-Phong模型通过Ambient + Diffuse + Specular来简单粗暴的着色。

但其也有缺点:

  1. 能量不保守,使用Blinn-Phong模型的出射光照能量可能大于入射光照的能量,这在计算光线追踪时会带来很大的问题:这一过程在光线追踪中经过无限次反弹后,会使得本该暗的地方变得过于明亮。

  2. 难以表现真实的质感,Blinn-Phong模型虽然比较经典,但它却很难表现出物体在真实世界中的模样,总是有一种”塑料“感。

简化阴影

最常见的处理方式就是Shadow Map:先在光源处放置相机,以z-buffer的方式储存一张深度缓冲,第二次将相机放置在view位置,并将视锥内的点的深度和深度缓冲中的对应点(矩阵变换)的深度进行对比,若前者大于后者,则认为视锥中的点处于阴影中

缺点:
光源处的采样率和观察处的采样率不一样,有分辨率限制,同时光源角度大时会出现自阴影锯齿的问题

三、基于预计算的全局光照

3.1挑战和计算思路

空间换时间

  • 挑战
    1. indirect Light 要想去采样(整个球面)数据量非常大,需要有合适的方式压缩
    2. 并且还得便于在渲染方程中进行积分

傅里叶变换

可以把空间域信号转变为频域信号,截取频域的一小段就可以实现对频率整体的一个粗糙的表达,还可以反傅里叶计算还原会空间域。(高效压缩)

卷积定理是傅立叶变换满足的一个重要性质。卷积定理指出,函数 卷积的 傅立叶变换是函数傅立叶变换的乘积。具体分为时域卷积定理和频域卷积定理,时域卷积定理即时域内的卷积对应频域内的乘积;频域卷积定理即频域内的卷积对应时域内的乘积,两者具有对偶关系。

球谐函数(Spherical Harmonics)

SH是拉普拉斯方程的一组限制在球上的解,可以理解为一组sin\cos组成的正交基,数量越多,可以表达的精度越高;并且相互之间正交(卷积为0–简化计算的核心)且二阶导数为0(拟合表面光滑)
在这里插入图片描述
一般实时渲染只取前3阶就够了(9个),因为一般只需要低频信息(因此也无法表达更高频);有时只需要知道光从哪里来,就只需0和1阶就够了(4个),如下图。「在这种情况下,压缩后只用32bits(4Bytes)就可以存储一个像素的颜色。卷积时先投影到SH正交基上再系数相乘即可」在这里插入图片描述

3.2 SH Lightmap:预计算 GI

有了SH,我们就可以将场景参数化到一张巨大的lightmap贴图上(通常被称为地图集atlas):对所有表面点的irradiance进行离线计算并压缩为SH系数、保存进atlas

  • 计算过程:
    1. 对世界物体进行几何简化(因为要把三维空间复杂集合投影到二维空间),如下图,并且参数分配时需要尽可能在同样的面积或体积内分配的texel精度近似
      在这里插入图片描述
    2. lighting:将lightmap映射到各级LOD上,应用模型细节,用HBAO(水平基准环境光遮蔽Horizon based ambient occlusion,升级版SSAO)加上短程(short-range)增加高频的灯光细节,再加上直接光照和材质的效果----下图1是单应用lightmap的光照效果,可以看到已经有很多细节和软阴影效果了,下图2是最终应用效果
      在这里插入图片描述
      在这里插入图片描述

Lightmap优缺点和可借鉴思想:

  • 优点:
    1.实时运行效率很高;
    2.可以表现出环境中全局光照的许多细节
  • 缺点:
    1.预计算时间非常长(因此老师自己的引擎宁死不用);
    2.只能处理静态场景物体和静态光照(动态物体会有类似人物走到一小块阴影里整个人变黑的bug);
    3.空间换时间,占用内存较大(几十到几百MB)
  • 可借鉴优秀思想:
    1. 空间换时间
    2. 把整个场景参数化到二维的tex上(或三维vol上也一样),方便计算

3.3 探针 Probe:Light Probe + Refection Probe

  • 优点:运行效率高,静动态物体都可用,可以处理漫反射和镜面反射
  • 缺点:大量的光探测SH需要预计算,没办法做到像lightmap那样那么好的细节(采样太稀疏)

Light Probe

在空间中放置很多采样点,每个采样点采集对应光场信息,物体经过时寻找附近的采样点并插值计算

自动探测点生成:空间内均匀的产生采样点,再根据玩家的可到达区域和建筑物的几何结构进行延拓,相对均匀的分布采样点

Refection Probe

类似的反射probe,数量少,但采样精度很高,应用在镜面等场景

3.4 基于图像的光照(Image-Based Lighting,IBL)

主要思路还是预计算,把复杂的积分都先预计算过,以减少光照中的计算时间。我们会分别预计算漫反射项和镜面项,最终在实时渲染中只需通过简单的纹理采样即可得到结果

  • diffuse:提前将cubemap与反射光卷积的结果计算并储存在Irradiance Map中,使用时只需要取位置上的结果就可以了,见下图左
  • specular:近似为Lighting Term和BRDF Term的乘积
    1. Lighting Term:由于不同粗糙度造成的高光结果不一样,用cubemap的minmap存储多个粗糙度的结果,用minmap的精度刚好对应不同粗糙度下的不同精度,见下图右
    2. BRDF Term:直接预计算保存到了一张LUT图里,使用F和粗糙度加载即可

四,基于物理的材质

4.1 微平面理论

见闫老师相关课程笔记:
games101:Microfacet微平面理论+cook-torranceBRDF方程计算
games202:五,基于物理的材质:Microfacet、Kulla-Conty估计、LTC、NPR

  • 迪士尼材质参数的设计原则(思路相当有参考性)
    1. 物理材质参数应当直白易懂(符合艺术家的直觉,让艺术家能理解)
    2. 材质参数应当尽可能的少
    3. 参数取值范围尽量是0-1
    4. 超过合理范围时最好能产生一个make sense的结果
    5. 各种参数的组合应当合理且有意义(每一个参数组合都有意义)

4.2 IBL放到3.4去了,但实际理论与PBR很相近

四,阴影(Shadow)

4.1大世界Cascade Shadow级联阴影

对视锥体进行分层,远处的精度降低,近处提高。

  • 需要优化点:blend between Cascade Laters:在层级之间边界的地方做插值以避免出现视觉断层。
  • 优点:解决透视混叠(perspective aliasing)问题;快速生成深度图,深度写入时可提升3倍;效果不错
  • 缺点:存储空间大(空间换时间);绘制时成本昂贵;几乎不可能生成高质量的区域阴影;没有彩色阴影,半透明投射出不透明阴影
    在这里插入图片描述

4.2 软阴影

详情见闫老师的课程:games202:二,实时阴影Shadow Mapping、软阴影PCF、PCSS、VSSM、MSM、SDF

  • PCF(Percentage Closer Filter)
  • PCSS(Percentage Closer Soft Shadow)
  • VSSM(Variance Soft Shadow Map)

4.3 Virtual Shadow Maps

原理:类似Tiled Virtual Texture
现代引擎可以关注这个方向
UE5中VirtualShadowMap的简易实现原理(一)

总结

5-10年前流行的3A配置:

  • Lightmap+LightProbe
  • PBR+IBL
  • Cascade shadow + VSSM

技术展望

GPU显卡快速升级
real-time Ray-Tracing on GPU
Real-Time Global Illumination:SSGI、SDF based GI、Voxel-based GI(SVOG/VXGI)、RSM/RTX GI
更复杂的材质模型:BSSRDF、BSDF(Strand-based hair)

过量shader

  • 艺术家搞出大量shadergraph
  • 程序员给shader的各种变化都写了单独的shader(??不就是我们公司)
  • 不同平台编译语言不同

Uber Shader:每一种变化组合都写入同一个shader,通过宏定义控制分支(会产生大量变体)
优点:某个算法改进时需要更新所有相关shader,容易出错,用Uber shader就不会有这个问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检,是理解公司内部运作机制和市场表现的一把钥匙,能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息,并对…

Linux:传输层(1) -- UDP协议

1. 端口号 同一台主机的不同端口号(Port)标记了主机上不同的进程,如下图所示: 在 TCP/IP 协议中 , 用 " 源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信 ( 可…

制作excel模板,用于管理后台批量导入船舶数据

文章目录 引言I 数据有效性:基于WPS在Excel中设置下拉框选择序列内容II 数据处理:基于easyexcel工具实现导入数据的持久化2.1 自定义枚举转换器2.2 ExcelDataConvertExceptionIII 序列格式化: 基于Sublime Text 文本编辑器进行批量字符操作引言 需求: excel数据导入模板制…

基于 HTML+ECharts 实现的大数据可视化平台模板(含源码)

构建大数据可视化平台模板:基于 HTML 和 ECharts 的实现 大数据的可视化对于企业决策、市场分析和业务洞察至关重要。通过直观的数据展示,团队可以快速理解复杂的数据模式,发现潜在的业务机会。本文将详细介绍如何利用 HTML 和 ECharts 实现一…

js逆向——origin/refer请求头反爬

今日受害网站: https://www.regulations.gov/docket/FDA-2016-D-1399/document 最终目标:爬取该网站中的新闻摘要 首先打开网页,刷新一下,观察都返回了哪些数据 然后我们ctrlf进行关键字搜索 进一步,只过滤含有docu…

Linux_实现TCP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 listen 1.4 accept 1.5 read 1.6 write 1.7 服务器代码 2、实现客户端的逻辑 2.1 connect 2.3 客户端代码 3、实现服务器与客户端的通信 结语 前言: 在Linux下,实现传输层协议为TCP…

MySQL数据库-备份恢复

一、MySQL日志管理 1.为什么需要日志 用于排错用来做数据分析了解程序的运行情况,了解MySQL的性能 2.日志作用 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,就必须保证数据的安全性和完整性&#…

鸿蒙SDK开发能力

什么是鸿蒙SDK:HarmonyOS(Software Development Kit)是面向应用和服务开发的开放能力合集,本质就是工具集,与JDK、AndroidSDK在逻辑上有相似之处 18N:1指的是手机,8指的是车机、音箱、耳机、手表/手环、平板、大屏、PC、AR/VR&am…

PCL-基于超体聚类的LCCP点云分割

目录 一、LCCP方法二、代码实现三、实验结果四、总结五、相关链接 一、LCCP方法 LCCP指的是Local Convexity-Constrained Patch,即局部凸约束补丁的意思。LCCP方法的基本思想是在图像中找到局部区域内的凸结构,并将这些结构用于分割图像或提取特征。这种…

DolphinScheduler学习

1.查看文档 点击访问:https://dolphinscheduler.apache.org/zh-cn/docs 我们可以看到相关的文档简介里有 介绍 DolphinScheduler是Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化…

太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的不断进步,智能制造已经成为推动制造业转型升级的重要力量。太原高校大学智能制造实验室紧跟时代步伐,积极推进数字孪生可视化系统平台的建设,并于近日圆满完成了项目的验收工作。这一里程碑式的成果,不仅标志着实验室在…

uniapp安卓plus原生选择系统文件

uniapp安卓plus原生选择系统文件 效果&#xff1a; 组件代码&#xff1a; <template xlang"wxml" minapp"mpvue"><view></view> </template> <script>export default {name: file-manager,props: {},data() {return {is…

靶场实战 _ ATTCK 实战 Vulnstack 红队

环境配置 网络拓扑图 (仅供参考) 攻击机&#xff1a;kali ip:192.168.111.5靶机&#xff1a;web-centos 外网ip:192.168.111.10 内网ip:192.168.93.100web1-ubuntu ip: 192.168.93.120PC ip: 192.168.93.30win 2008 ip:192.168.93.20win 2012 ip:192.168.93.10 信息搜集 端口…

【C++】string类(下)

个人主页~ string类&#xff08;上&#xff09; string类 二、模拟实现string类1、头文件string.h2、常见构造3、容量函数4、访问及遍历5、类对象修改6、流插入流提取重载 二、模拟实现string类 今天我们来实现一下上篇文章中详细介绍过的接口 1、头文件string.h #pragma onc…

Redis的应用场景及类型

目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下&#xff0c;我们就可以把 Mys…

【常微分方程】

框架 常微分方程的概念一阶微分方程可变离分量齐次方程一阶线性微分方程可降阶的高阶微分方程二阶常系数齐次线性微分方程二阶常系数非齐次线性微分方程 讲解 【1】 常微分方程&#xff1a;是微分方程的特殊情况&#xff1b; 阶&#xff1a;是方程未知函数的最高阶导数的阶数&…

ElementUI,修改el-table中的数据,视图无法及时更新

需求&#xff1a;点击table表格中的“修改”之后&#xff0c;当前行变为可输入状态的行&#xff0c;点击“确定”后变为普通表格&#xff1b; 先贴上已经完美解决问题的代码 实现代码&#xff1a; <section><div style"display: flex;justify-content: space-b…

爬虫学习1:初学者简单了解爬虫的基本认识和操作(详细参考图片)

爬虫 定义&#xff1a;爬虫&#xff08;Web Crawler 或 Spider&#xff09;是一种自动访问互联网上网页的程序&#xff0c;其主要目的是索引网页内容&#xff0c;以便搜索引擎能够快速检索到相关信息。以下是爬虫的一些关键特性和功能&#xff1a; 自动化访问&#xff1a;爬虫能…

【React】事件绑定:深入解析高效处理用户交互的最佳实践

文章目录 一、什么是事件绑定&#xff1f;二、基本事件绑定三、绑定 this 上下文四、传递参数五、事件对象六、事件委托七、常见事件处理八、优化事件处理 React 是现代前端开发中最受欢迎的框架之一&#xff0c;其组件化和高效的状态管理能力使得构建复杂的用户界面变得更加容…

嵌入式MCU固件的几种Flash划分方式详解

通过OTA远程等方式下载的程序,其实还需要提前下载bootloader程序,才能进一步下载APP程序。 今天就来说说通过OTA方式升级固件时,几种flash划分方式。 独立型 所谓独立型就是专门划出一部分闪存(Flash)空间用来存储引导程序(BootLoader)。 如下图: BootLoader:引导…