GAMES104:06(下)游戏中地形大气和云的渲染2-学习笔记

news2024/9/22 5:39:20

文章目录

  • 三、大气Atmosphere
    • 3.1 大气散射理论
      • 3.1.1 Analytic Atmosphere Appearance Modeling(经验模型)
      • 3.1.2 Participating Media参与介质
      • 3.1.3 辐射传递方程RTE(Radiative Transfer Equation)
      • 3.1.4 体积渲染公式VRE(Volume Rendering Equation)
    • 3.2 大气物理学(Real Physics in Atmosphere)
      • 3.2.1 Rayleigh Scattering(瑞利散射)
      • 3.2.2 Mie scattering(米氏散射)
      • 3.2.3 Variant Air Molecules Absorption(光的吸收)
      • 3.2.4 single Scattering vs Multiple Scattering(单次散射 vs 多次散射)
    • 3.2 实时大气渲染
      • 3.2.1 PreComputed Atmospheric Scattering
      • 3.2.2 (预计算方法简化版)
  • 四,云的渲染
    • 4.1 Volumetric Cloud Modeling
    • 4.2 Rendering Cloud by Ray Marching
  • Q&A


天空由大气和云组成的,先放一张课程开始的美图
在这里插入图片描述

三、大气Atmosphere

3.1 大气散射理论

3.1.1 Analytic Atmosphere Appearance Modeling(经验模型)

类似光线追踪,大气渲染也有类似渲染公式,在实际处理中也有类似 Blinn-Phong的拟合模型。关键参数是view到天顶的角度和到太阳的角度,给出两个参数就可以通过以上公式算出一个解析解,就可以得到颜色

在这里插入图片描述

  • 优点:计算简单且有效
  • 缺点:只有地表视角;参数写死,得出的解也是固定的,真实情况的下雨等情况不能覆盖

3.1.2 Participating Media参与介质

指构成大气中各种透明又不透明的粒子,主要有各种气体和气溶胶介质

  • 光和大气介质的交互:
    1. 光被吸收(Absorption)
    2. 光被散射(Out-scattering)
    3. 自发光(Emission)
    4. 周边被点亮的气体,散射过来照亮自己(In-scattering)

3.1.3 辐射传递方程RTE(Radiative Transfer Equation)

  • 这四种合到一起就形成了辐射传递方程RTE(Radiative Transfer Equation)----知道概念,不用记,后续全都预计算
    (σ𝑎:吸收系数、σ𝑠:散射系数)
    在这里插入图片描述

3.1.4 体积渲染公式VRE(Volume Rendering Equation)

  • RTE表达的是一个梯度,对RTE积分,就得到体积渲染公式VRE(Volume Rendering Equation)
    方程主要讲了两个东西:

其中有2个主要变量:

  1. Transmittance(通透度):假设我在M点放一个东西,到p点还能剩下多少(路径积分的结果)
  2. Scattering Function:路径叠加到的沿途散射过来的光,打到相机的部分

3.2 大气物理学(Real Physics in Atmosphere)

大气主要有两个参数者:

  • 太阳:太阳由各种不同的波长的光组成
  • 大气:主要有两类----气体(小于太阳波长)和气溶胶(接近太阳波长)

3.2.1 Rayleigh Scattering(瑞利散射)

当空气中介质尺寸远小于光的波长的时候(气体):

  1. 空气中的光是四面八方均匀散射,不太具有方向性
  2. 对于越短的波长(蓝紫光),它散射的越远,对越长的波长(红光),散射的越近
  • Rayleigh Scattering Equation:
    在这里插入图片描述
    λ:光的波长,因此 1 λ 4 \frac{1}{λ^4} λ41也说明波长越短,散射越多
    θ:入射光和散射光的夹角(旋转不变)
    h:海拔高度
    ρ:大气密度,在海平面上等于1,随着高度上升呈指数递减
    n:空气折射率

可以看到,在给定海拔高度和空气密度时,散射方向只与face function(形状函数)也就是 1 + c o s 2 θ 1+cos^2θ 1+cos2θ有关,参数只有一个θ角。

这就可以解释
为什么天空是蓝色----波长短散射多;
为什么晚霞是红色----入射角小蓝色散射出视角了,剩下红色;

这也解释了天空在白天是蓝色在傍晚是偏红的原因:

3.2.2 Mie scattering(米氏散射)

当空气中介质尺寸接近或大于波长时(气溶胶):

  1. 散射有一定方向性,更多散射再光的传播方向
  2. 但对波长不敏感,同等的散射所有波长
  • 米氏散射方程(Mie Scattering Equation) 在这里插入图片描述

方程引入了一个Geometry Parameter:g

  1. g = 0时,就变成了瑞利散射的形状
  2. g > 0 时,更接近于图中章鱼形状
  3. g < 0 时,会往相反的方向散射得更多(g一般大于0)

日常生活中的雾就是气溶胶,表现为无差别散射,所以是白色的;而傍晚的光晕是有方向性的米氏散射,所以有个halo在太阳附近(雨天的路灯也一样)

3.2.3 Variant Air Molecules Absorption(光的吸收)

空气中的臭氧(O3)和甲烷(CH4)能够吸收长波的光,比如臭氧吸收红橙黄光,甲烷吸收红光。(海王星为什么是蓝色—其表面的大量甲烷吸收了红光,显现蓝色)

我们计算也要考虑这种光的吸收,但实际计算过程中会假设这些气体是均匀分布在整个大气中的(实际上并不是,比如臭氧集中在大气上层)

3.2.4 single Scattering vs Multiple Scattering(单次散射 vs 多次散射)

在这里插入图片描述

  • 单次散射:眼睛看到一个点,看到的是该方向所有被太阳光照亮后,散射到我眼睛这个方向的能量和的Transmittance积分
  • 多次散射:其他物体散射的光照亮我实现方向的粒子,相当于光追的多Bounce-----现代3A游戏必须面对的重要问题

「多散射和GI的区别:GI是光照射到了一个面,然后反射到其他地方最后照射的你的眼睛,而多散射则作用于空间中连续不断地空气」
在这里插入图片描述

3.2 实时大气渲染

Ray Marching 我们都知道是沿着视线路径把结果一步一步积分的方法

3.2.1 PreComputed Atmospheric Scattering

  • Transmittance LUT

这里也可以借助预计算的思想,先用Ray Marching去计算给定点的最终的单次散射的Transmittance,并把最终积分结果存放到 LUT中,通过两个参数:θ:视线和天顶(y+)的夹角;h:海拔高度,就可以获得Transmittance。

并且,如果视点到B的通透度:𝑇(𝑋𝑣−>𝐵),中间点m到B的通透度:𝑇(𝑋𝑚−>𝐵),那么视点到m的通透度为: T ( X v − > B ) T ( X m − > B ) \frac{T(X_v->B)}{T(X_m->B)} T(Xm>B)T(Xv>B)
在这里插入图片描述
有了这个公式之后,单次散射公式就可以表示为:
在这里插入图片描述

  • Single Scattering LUT

这里最重要的是一种参数化思想,将三维角表达为3个角度,做成一组LUT图,叫Single Scattering LUT(4维表),来表示站在所有点在所有太阳角度下看任何方向的一次散射的预计算结果,将其保存在个3Dtexture array里(其实应该用3D texture,方便中间高度采样)。

其中:
η:视点到太阳的方向和天顶夹角,cos值为μs
θ:视线和天顶夹角,cos值为μ
φ:视点到太阳的方向与视线夹角,cos值为v
h:视点海拔高度

  • Multiple Scattering LUT

进一步的,通过通透度LUT图和单次散射LUT图,就可以计算出二次、三次以及更多次散射的LUT表(一般3、4次就够了),这些图与一次散射LUT图长得一模一样。

借用以上这些与计算图就可以在runtime下达到一个很好效果的实时计算。

在这里插入图片描述

  • 该预计算方法缺点:
    1. 预计算耗费很大,多次散射的迭代计算成本高,其次是在移动端没法用。(即使在PC上用computeShade需要几毫秒甚至一秒,但可能分到很多帧去完成)。
    2. 没法处理动态环境调整,比如晴天到阴雨的过渡,需要有个平滑的过渡,因此每帧的表都要计算,消耗过大;同时艺术家编辑时调节参数也不方便。
    3. Runtime实时处理时需要做很多逐像素的高维LUT表的插值(为了效率经常要下采样)。

3.2.2 (预计算方法简化版)

前沿的游戏行业简化计算方法,UE正在用的:A Scalable and Production Ready Sky and Atmosphere Rendering Technique,pdf连接

他假设:散射是低频的,对于空气中的分子的散射是各向同性的,因此光是均匀的,散射也是均匀的,每级散射直接按百分比衰减就行了,多次散射就变成了等比数列,介质多次散射的结果总和就变成了数列求和。???

这样一来就极大加快了速度,可以每一帧都进行计算了,那原方法LUT中的高度h参数就没有意义了,同时每帧都算的话,太阳顶角的参数也就不需要了,所以新方法的LUT表中只需要计算出观察方向的天顶角 θ 和一个水平方向环绕360度的夹角 ϕ(对应原来太阳到观察视角水平方向的夹角)即可,化四维为二维,见下图左。

如果再加上大气中沿着路径的透明度积分影响,那就再加上一个相机距离的参数,形成一个3Dtexture,见下右图。

这样一来,太阳月亮、下雨晴天等情况就都能表达了;只有在空气散射度特别高、雾很浓的情况下,会有比较大的偏差,甚至有色偏。并且效率非常高,支持移动端。
在这里插入图片描述

四,云的渲染

云的类型从低到高有层云、积雨云、高层云、高积云、、卷层云、卷积云等等。

早期实现云的方式有:

  • Mesh-Based Clod Modeling:mesh硬做,大概模型+noise、腐蚀算法等实现,现在基本没人用了,效率低且不动态
  • Billboard Cloud:用半透明插片模拟,虽然效率高,但效果差、云的种类有限

4.1 Volumetric Cloud Modeling

  • 优点:云的形状真实、可以实现大尺寸的云、支持动态天气、支持动态体积光照和阴影
  • 缺点:算法复杂,花费巨大(但因为效果好,现在3a游戏还是会用)

思路:Weather Texture(形状分布+0-1值表示的厚度) + 平移、扰动变形
在这里插入图片描述

  • 这里的noise扰动对其真实性非常重要,比如Perlin Noise(棉絮状噪声)和Worley Noise(细胞结构状)等
  • 具体实现:先利用低频把云的规则边缘模糊化,再加上一些高频来优化细节。

在这里插入图片描述

4.2 Rendering Cloud by Ray Marching

那做出来云之后如何进行渲染呢?Ray Marching

  1. 对每个屏幕像素做射线,看能不能打到云
  2. 在没打中云时采用较大的步长(云设定在固定高度)
  3. 打中云时采用非常小的步长
  4. 在打中的每一个点计算通透度以及散射(比大气散射计算更要简化,因为云通透度很低)

效果很好,不过计算还是比较贵,但是是现代游戏引擎的标配。
在这里插入图片描述

Q&A

  • 本节课讲的地形四叉树管理与前边讲的GameObject的四叉树管理是否可以共用?

是的,完全共用

  • 体积云的渲染是否比较耗时,怎么解决?

是的,虽然简化了很多,但计算还是不少,并且云的颜色还会受到大气影响,乱七八糟加起来还是很耗时。可以优化比如:Ray Marching时对屏幕像素进行下采样,只计算1/4像素;再加上DLSS辅助。

  • 大气散射计算的终止条件是什么:多次散射计算3-4次

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

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

相关文章

比原生Transformer快的LMDeploy

创建conda环境 conda create lmdeploy conda activate lmdeploy 安装依赖包(注&#xff1a;下对应的版本要不然容易报错) pip install pytorch2.1.2 pip install lmdeploy[all]0.3.0 下载模型 通过Git协议下载模型。首先安装git-lfs组件 此处使用的root权限 curl -s ht…

YOLOv8改进 | 主干网络 | 简单而优雅且有效的VanillaNet 【华为诺亚方舟】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

【C++核心篇】—— C++面向对象编程:封装相关语法使用和注意事项详解(全网最详细!!!)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、封装&#xff08;类&#xff09;1.封装的使用&#xff08;类和对象&#xff09;2. 对象的初始化和清理2.1 构造函数2.2 析构函数2.3 构造函数的分类及调用 …

海外仓代理模式,借鸡生蛋也能成为跨境新出路

国际物流是跨境电商生态圈同质化最严重跨境电商最开放的“地带”。唯独海外仓&#xff0c;算是国际物流行业唯一的一块“世外桃源”&#xff0c;但一个1000平米的小仓库&#xff0c;每年至少要花费100万的运转资金&#xff0c;无论是新企业还是成熟的企业&#xff0c;建立海外仓…

成都云飞浩容文化传媒有限公司怎么样?靠谱吗?

在数字经济的浪潮中&#xff0c;电商行业如同一艘巨轮&#xff0c;乘风破浪&#xff0c;不断前行。而在这片波澜壮阔的蓝海中&#xff0c;成都云飞浩容文化传媒有限公司犹如一颗璀璨的新星&#xff0c;以其专业的电商服务能力和前瞻性的市场洞察&#xff0c;为众多品牌搭建起通…

【Python机器学习】支持向量机——基于最大间隔分隔数据

有些人认为&#xff0c;SVM是最好的现成的分类器&#xff0c;这里说的“现成”指的是分类器不加修改即可直接使用。同时&#xff0c;这就意味着在数据上应用基本形式的SVM分类器就可以得到低错误率的结果。SVM能够对训练集之外的数据点做出很好的分类决策。 支持向量机&#x…

SAP ABAP SUBMIT 用法详解(看这一篇就够了)

文章目录 前言一、案例介绍/笔者需求二、B报表&#xff08;被SUBMIT的程序&#xff09;三、A报表&#xff08;用SUBMIT的程序&#xff09; a.SUBMIT B程序 b.AND RETURN 详解 c.CL_SALV_BS_RUNTIME_INFO 捕获ALV数据的方法 d.捕获…

使用STM32实现一个线性代数计算器

文章目录 背景挑战与困难如何整合编译&#xff1f;error: non-ASM statement in naked function is not supportederror: #pragma import is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6error: redefinition of __FILE 改造demo中的cout改造delete运…

gdb调试 查找段错误

先设置 程序崩溃时的core文件产生 ulimit -c unlimited http://t.csdnimg.cn/BBGBQ 记得改完之后重启虚拟机。 core文件&#xff1a;当程序发生异常&#xff08;如段错误&#xff09;并退出时&#xff0c;操作系统可以选择生成一个 core 文件。这个文件包含了程序崩溃时刻…

【吊打面试官系列-Dubbo面试题】Dubbo 支持服务降级吗?

大家好&#xff0c;我是锋哥。今天分享关于 【Dubbo 支持服务降级吗&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Dubbo 支持服务降级吗&#xff1f; 以通过 dubbo:reference 中设置 mock"return null"。mock 的值也可以修改为 true&#xff0c;然…

软测面试二十问(最新面试)

1.软件测试的流程是什么 参加需求评审会&#xff0c;解决需求疑问---写测试用例---对测试用例进行评审---评审后开始执行测试---提交bug---追踪bug---关闭bug---回归测试---交叉测试---编写测试报告---冒烟测试 2.什么是黑盒测试和白盒测试&#xff1f;它们有何区别 黑盒测试…

医院HIS搭建|HIS系统开发|HIS系统源码

在现代医疗管理中&#xff0c;医院信息系统&#xff08;HIS&#xff09;扮演着至关重要的角色。它是一个综合性的信息平台&#xff0c;旨在提高医院运营效率&#xff0c;优化患者护理&#xff0c;并确保医疗数据的准确性和安全性。以下是HIS系统包含的一些核心功能&#xff1a;…

抖音短视频矩阵管理系统:短视频运营的得力助手

1. 抖音短视频矩阵管理系统介绍 随着短视频行业的迅速发展&#xff0c;越来越多的企业和自媒体人开始关注短视频运营。抖音作为国内最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和丰富的内容资源。为了更好地管理和运营短视频&#xff0c;抖音短视频矩阵管理系统应…

数据结构:线性表(上)

谈到线性的数据结构&#xff0c;那肯定离不开两个最基础的&#xff1a;数组和链表&#xff0c;当然有了数组和链表就会聊到栈和队列。 那么本篇我们就来介绍数组和链表 一、数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;…

Linux操作系统及gcc工具实验报告

Linux操作系统及gcc工具实验 一、 实验目的 1&#xff0e;学习在VMware虚拟机上搭建Linux操作系统。 2&#xff0e;掌握Linux操作系统的环境配置及使用。 3. 学会使用gcc工具编译。 二、 实验环境 硬件&#xff1a;PC机 软件&#xff1a;VMware虚拟机、Linux系统。 三、…

8-springboot集成nacos config

本文介绍spring boot集成nacos config&#xff0c;注意这里和spring cloud没任何关系&#xff0c;单纯基于spring boot。 0、环境 jdk 1.8nacos 2.0.3Idea 2021.1maven 3.8.1 1、springboot搭建 Idea新建maven项目&#xff0c;构建完成后&#xff0c;添加以下依赖&#xff…

新160个crackme - 018-crackme_0006

运行分析 输入Name和Serial&#xff0c;点击Check无反应 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到关键字符串&#xff0c;进入关键函数 通过静态分析和动态调试&#xff0c;得到以下结论 总结&#xff1a;1、String Serial2、String2 是…

JavaScript_语法_运算符_一元运算符

变量_ typeof 运算符&#xff1a; (可以使用 typeof 运算符来确定 JavaScript 变量的数据类型) 注&#xff1a; 复杂数据 typeof 运算符把对象、数组或 null 返回 object。 null被认为是对象的占位符 1.5 运算符 1.一元运算符&#xff1a;只有一个运算数的运算符 eg. A , …