Games104——渲染中光和材质的数学魔法

原文链接

渲染方程及挑战

在这里插入图片描述

挑战

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

基础光照解决方案

Blinn-Phong模型:

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

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

简化光源

用平行光、聚光灯、点光源作为MainLight 来简化各种光源,用Ambient Light替代光源外的环境光
用可采样的环境贴图代替反射光线,环境贴图的mipmap代替粗糙度表现
最终结果 = MainLight + Ambient Light+Environment Map

简化材质(Blinn-Phong模型)

基于光可叠加原理(渲染方程中用体现),Blinn-Phong模型通过Ambient + Diffuse + Specular来简单粗暴的着色。
在这里插入图片描述
布林冯模型存在的问题

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

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

简化阴影

在这里插入图片描述
阴影:当光线被不透明物体阻挡时形成的空间
在这里插入图片描述
最常见的处理方式就是Shadow Map:先在光源处放置相机,以z-buffer的方式储存一张深度缓冲,第二次将相机放置在view位置,并将视锥内的点的深度和深度缓冲中的对应点(矩阵变换)的深度进行对比,若前者大于后者,则认为视锥中的点处于阴影中

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

基于预计算的全局光照

挑战和计算思路

空间换时间

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

傅里叶变换

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

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

球谐函数(Spherical Harmonics)

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

SH Lightmap:预计算 GI

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

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

lightmap的光照效果,可以看到已经有很多细节和软阴影效果了,下图是最终应用效果
在这里插入图片描述
Lightmap优缺点和可借鉴思想:

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

探针 Probe:Light Probe + Refection Probe

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

Light Probe

在这里插入图片描述

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

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

Refection Probe

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

基于物理的材质

微平面理论

BRDF==Material
BRDF(广义)最常用在实时渲染管线中的是Cook-Torrance 模型,其中兼顾了漫反射和镜面反射2个部分
Lambertian漫反射部分
我们知道理想漫反射的反射光线是均匀散布在各个方向的(半球),因此漫反射的BRDF值一定是个常数。假设入射光均匀且布满整个半球,可以得到如下推导:「半球对cos积分结果为π」
cook-torrance镜面反射部分
微表面模型细看有很多凹凸细节,这些细节可看作微小的镜面,远看就像是完全的平面,只能感受到微小平面对整体的作用。现实生活中就算是纯金属表面也有划痕、磨砂等,因此微表面模型能表示非常多实际物体。
菲涅尔方程(Fresnel Rquation)
现实中在不同的角度看物体,明显看到反射率不同(看玻璃也是)

微平面理论
在这里插入图片描述

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

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

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

阴影(Shadow)

Cascade Shadow级联阴影

对视锥体进行分层,远处的精度降低,近处提高。
在这里插入图片描述

需要优化点:blend between Cascade Laters:在层级之间边界的地方做插值以避免出现视觉断层。

优点:解决透视混叠(perspective aliasing)问题;快速生成深度图,深度写入时可提升3倍;效果不错
缺点:存储空间大(空间换时间);绘制时成本昂贵;几乎不可能生成高质量的区域阴影;没有彩色阴影,半透明投射出不透明阴影

软阴影

PCF

「该技术起初是用于抗锯齿\反走样,后来发现软阴影也可以用。」
「为什么不对shadow map做滤波?因为把shadow map模糊后,在深度判定完还是硬阴影(相当于二值化)。」

原理是在阴影判定时做一个filtering----不仅计算当前着色点对应shadow map上的深度,还计算该点在shadow map上周围一圈(比如7x7)的深度判定结果(非0即1)并取平均,将平均值作为Visibility项。「如果滤波核比较大,可以在范围内随机采样固定个数」
在这里插入图片描述

PCSS

很多引擎的标配
投影平面上的阴影到物体的距离越远,阴影越软、滤波核越大。
投影平面离物体越近,阴影越硬、滤波核越小。「即下图W越大,阴影越软」
在这里插入图片描述

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就不会有这个问题

Virtual Shadow Maps

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

总结

5-10年前流行的3A配置:
Lightmap+LightProbe
PBR+IBL
Cascade shadow + VSSM

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

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

相关文章

RV1126+FFMPEG推流项目源码

源码在我的gitee上面,感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子 此例子用于socket 例子, 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子, 该例子只能用于一个客户端连接server。…

2D 超声心动图视频到 3D 心脏形状重建的临床应用| 文献速递-医学影像人工智能进展

Title 题目 2D echocardiography video to 3D heart shape reconstruction for clinicalapplication 2D 超声心动图视频到 3D 心脏形状重建的临床应用 01 文献速递介绍 超声心动图是心血管医学中一种至关重要且广泛应用的影像学技术,利用超声波技术捕捉心脏及其…

再见 Crontab!Linux 定时任务的新选择!

引言 说到 Linux 下定时执行任务,大多数人可能会想到 crontab?没错,它的确是 Linux 下比较通用和方便的方式,但是今天我来介绍一种新的方法来创建定时任务并且支持更多更强大的功能。 Systemd 很多小伙伴应该听说过 Systemd&…

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下: C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…

2.5G PoE交换机 TL-SE2109P 简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK(普联)的万兆上联的2.5G网管交换机TL-SE2109P简单开箱测评。8个PoE 2.5G电口,1个万兆SFP上联口。 2.5G交换机 TL-SE2420 简单开箱评测,16个2.5G电口4个10G光口(SFP):https://blog.zeruns.com/archives/837.html…

simulink入门学习01

文章目录 1.基本学习方法2.图形环境--模块和参数3.激活菜单---添加到模型3.1输入选项3.2添加到模型3.3更改运算3.4验证要求 4.乘以特定值--Gain模块4.1引入gain模块4.2更改增益参数4.3接入系统4.4大胆尝试 1.基本学习方法 今天突然想要学习这个simulink的相关知识,…

等变即插即用图像重建

大家读完觉得有帮助记得关注和点赞!!! 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架,该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务,从而避免了在每…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者:来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫,将网站索引到 Elasticsearch 中,然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo:https://github.com/Gunner…

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提:已经安装了jdk、maven、vscode,且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置,也可以在setting.json文件中直接编辑&…

Autosar CP中SWC收发LIN消息的函数调用流程原理解析

Part 1:SWC发送 在AUTOSAR架构中,软件组件(SWC,Software Component)要发送LIN消息时,通常通过COM模块的接口来发起请求。这是因为COM模块是AUTOSAR架构中负责信号和数据传输的核心模块,它为SWC提…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游数据如何落…

C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具

上一篇: C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示https://blog.csdn.net/beijinghorn/article/details/124675293 大家平时都怎么管理源代码与文件夹呢?世界上最好的集成开发环境…

【时时三省】(C语言基础)文件的顺序读写

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 文件顺序读写 示例: 这个会输出bit 如果把写文件的内容屏蔽掉 它就会把它清空 流 高度抽象的概念 可以往流里面写数据 c语言程序,只要运行起来,就默认…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

Bigemap pro批量设置属性/填充字段

在图层里面有大量点位或者线面需要批量编辑时,可以借助bigemap pro软件来进行编辑修改 第一步:在对应图层点击右键,选择样式,选择需要修改的点线面来设置图标、大小等,如图所示: 第二步:设置要…

全球化趋势与中资企业出海背景

1. 全球化趋势与中资企业出海背景 1.1 全球经济格局变化 全球经济格局正经历深刻变革,新兴经济体崛起,全球产业链重塑,中资企业出海面临新机遇与挑战。据世界银行数据,新兴市场和发展中经济体在全球 GDP 中占比已超 40%&#xff…

汇编与逆向(二)-汇编基础

一、汇编入门 (一)x86体系的CPU的工作模式 有两种基本的工作模式:实模式和保护模式。 实模式:也称为实地址模式,该模式最早被DOS,win9x所支持。可访问1M内存,可直接访问硬件,如对…

【游戏设计原理】77 - 沙盒与导轨

沙盒式体验和导轨式体验是游戏设计中两种截然不同的理念和手法,它们各自的特性和目标受众决定了其适用场景和设计思路。以下是对这两种体验的理解: 一、沙盒式体验 核心特点 自由度高:沙盒游戏给予玩家极大的自由,让他们自己决定…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…