【Unity大气散射】GAMES104:3A中如何实现大气散射

news2024/11/24 11:06:48

写在前面

前两天学习并整理的大气散射基础知识:【Unity大气渲染】关于单次大气散射的理论知识,收获了很多,但不得不承认的是,这其实已经是最早的、90年代的非常古老的方法了,后来也出现了一些优化性的计算思路和方法。因此,我打算先不急着跟各种教程在Unity中实现大气散射,而是再花时间来看看最近的游戏是如何去实现大气渲染的:06.游戏中地形大气和云的渲染(下) | GAMES104-现代游戏引擎:从入门到实践

接下来就跟着GAMES104讲地形大气和云渲染的部分学习并做简单的记录,设计到之前没提到的Mie散射也只选择直接截图PPT的方式记录啦!毕竟对于做作品来说,之后实现出来才是重要的~

当然,May佬的百人计划在今年8月份也有一期关于大气散射的讲解,这里也放上课程的链接以及对应的超长内容整理的知乎文章链接:

【百人计划】图形 4.6 雾之 大气散射_哔哩哔哩_bilibili

游戏魔法编程:unity实现完整大气散射 - 知乎

话不多说,开始今天的学习! 

1 理论知识的查漏补缺

1.1 天空组成

天空(球、离我们很远)与云(非常visible的、离我们很近)是两个最重要的元素。其实还有个东西Fog,但雾效并不只是大气,更多的是可控性的效果,所以这里把雾和天空/云分开来考虑。

3A的标准在手游实现将会非常坑爹hhh,另外我想实现的是风格化天空盒,会参考更多以精简计算。

1.2 Mie散射

太阳、大气中的气体分子与气溶胶分子,于是Rayleigh散射和Mie散射就被提出来了~Rayleigh散射波长越短散射的越厉害,而Mie散射对所有波长光一视同仁。

g=0的时候,跟Rayleigh散射差不多;但g>0的时候,下图右边所示就会会更加向前。

生活中的Mie散射

Mie散射就是一些日出日落halo。

1.3 多次散射

真实世界的散射绝对不止一次散射,一定还有多次散射!听上去很麻烦,但实际上目前的3A游戏多需要考虑多次散射。如下图右侧考虑多次散射的才是符合真实大气的样子:

1.4 Ray Marching

单次散射其实就是RayMarching(沿着视线不断向下积分,算是一种暴力解法吧),实际上计算所有的大气效果都是用Ray Marching这个思路。

2 新的东西

2.1 T项的LUT

大气中的光学现象其实就只有两个部分:Transmittance&Scattering,这俩分别对应着我上一篇文章中的衰减系数T项和散射系数S项,这里介绍了一种很机智的算法计算Transmiitance——Precomputed Atmosphere Scattering,预计算。

(插播一点,这里也可以看看游戏魔法编程:unity实现完整大气散射 - 知乎后面部分对LUT的介绍)

这里最重要的思想是参数化——对于海拔高度为h的点,用视线与天顶角度去计算T项,从这一点一路走到大气层边界,记录边界处的Transmittance值。

那我怎么去用这个LUT表?——去查!怎么查?如下左图,假设我们想知道Xm位置的山脉的Transmittance的值,查1(从人眼位置Xv出发到边界的值);查2(山脉Xm到边界的值),查1/查2就是当前Xv位置看Xm位置的Transmiitance的值了。

2.2 单次散射的LUT

选择海拔为h的点,向大气层边界去看(打出一条射线),这个时候看向的方向到天顶的角度1,这个时候太阳到天顶的角度2,看向的方向和太阳之间的角度3,这三个角度其实就得到了一个立体角!那么,这三个角度组成的立体角其实就能表达当前海拔高度所有视线方向沿途的Transmittance值,再从不同海拔通过RayMarching的方法一下获取一堆数据,这样一来就足以在一个3D Texture中将单次散射所有的光(4D数据)全部存下来了。

2.3 多次散射的LUT

我们用前两次的两个结果再做几次积分(其实3-4次已经够用了),就能得到多次散射的结果。

2.4 问题

预计算很费计算,手游上不太星。

刚开始是蓝天白云->下雨的效果的过渡,这个过渡需要很流畅;同时我们的美术会需要调整一些参数,这中间由于有预计算,会很麻烦。

2.5 更前沿的方法

这里是课程最后提到的UE采用的方法,是在论文A Scalable and Production Ready Sky and Atmosphere Rendering Technique的基础上实现的,具体可以看看这篇文章:UE4新版大气实时渲染-论文导读 - 知乎 (zhihu.com)

仅作简单的记录

对于一个分子,可以假设四面八方光是均匀的,那就算两次,知道一个差值,就知道后来所有的值的百分比了!

既然世界需要动态,那省事儿创造更流畅的画面才是关键,那假设人不变(干掉h),假设太阳不变(干掉太阳的那个角度),

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

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

相关文章

解决金仓数据库KingbaseES V8R3 由于修改系统时间导致sys_rman备份故障的问题

案例说明: 此案例,为复现“current time may be rewound”错误。对于数据库环境,在使用前必须保证系统时间的正确性。如果数据库创建后,再将系统时间修改为创建数据库之前的时间,在运行过程中将有可能导致新老事务判断…

Beego框架项目搭建步骤

1、执行 go env 指令,将输出当前 Go 开发包的环境变量状态。 GOARCH 表示目标处理器架构。 GOBIN 表示编译器和链接器的安装位置。 GOOS 表示目标操作系统。 GOPATH 表示当前工作目录。 GOROOT 表示 Go 开发包的安装目录。 2、安装beego 输入 go get github.com/as…

IB近三年的改革及未来发展趋势

【转自京领新国际】 据不完全统计,截至目前,IB课程已在全球160余个国家的5667所学校开设,其中,中国大陆有267所学校获得了IB认证。由于IB的教育理念非常适应创新性人才的培养需要,它也越来越被学校、家长和学生认可。那…

论文阅读 - On the efficacy of old features for the detection of new bots - CCF B

目录 摘要: 1.导言 2.文献综述 3 数据集 4.特征集 4.1 CAP_UNI Botometer分数 4.2.与帐户配置文件/时间线相关的功能 4.3.非官方Twitter账户发送的推文比例 4.4.实验装置 5. 实验结果 5.1. Celebrity-Botwiki 5.2. Verified-Botwiki 5.3. Verified-Vendo…

什么是APERAK?

APERAK(Application error and acknowledgement message)是由消息接收方发出的应用程序错误和确认信息。其目的是: a) 通知消息发送方他的消息已经被消息接收方收到,由于业务系统在处理过程中遇到错误,已被拒绝。 b) 向消息发送方确认消息已…

使用tushare数据画疫情感染人数地图

总是看到网上有各种各样的可以用地图来展示某一地区的情况,如GDP的增速、人口的变化等,于是就想想这个问题是否能用python来实现,经查阅资料发现,用python来画地图其实也并不难,做好数据和地图的关联就可以实现。 一、…

移动WEB开发之响应式布局--响应式开发

响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 原理就是在不同屏幕下,通过媒体查询来改变这个布局…

洞察市场需求,深耕大健康赛道,缤跃酒店打造一站式运动酒店品牌

近期,人民数据研究院发布《2022全民跑步运动健康报告》,报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压,2022年18-40岁的跑者开始成为中坚力量&…

一文搞懂测试左移和测试右移的 Why-How-What

1080306 6.35 KB 软件测试技术应当贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其核心目标是尽快尽早地发现软件产品中所存在的各种问题 bug—— 与用户需求、预先定义的不一致性。 然而,传统…

ElasticSearch——刷盘原理流程

ElasticSearch——刷盘原理流程刷盘原理流程名词和操作解释相关设置刷盘原理流程 整个过程会分成几步: 数据会同时写入buffer缓冲区和translog日志文件buffer缓冲区满了或者到时间了(默认1s),就会将其中的数据转换成新的segment并…

【JavaEE】Java 线程的几种状态

目录 一、线程状态的种类及含义 二、线程状态间的切换条件 (1)使用isAlive()判断线程的存活状态 (2)关于BLOCKED、WAITING、TIMED_WAITING状态之间的转换 1.TIMED_WAITING 2.WAITING 3.BLOCKED 4.jconsole.exe的使用方式…

当 chatGPT 被职场 PUA ,笑麻了!

大家最近是不是被 chatGPT 刷屏了?简单来说,chatGPT 是一个智能聊天引擎。 那 chatGPT 和小爱同学、 siri 有什么区别呢? 如果体验过的朋友,能感受到区别还是很大,chatGPT 的智能表现过于优秀,远远超过了这…

【C++】STL-string模拟实现

文章目录驼峰法命名面试题:写一个简洁版的stringstring成员变量构造函数析构函数拷贝构造函数获取C形式的字符串 c_str赋值重载 operator简易版代码:string的改造 ->支持增删查改接口总览string成员变量构造函数交换拷贝构造赋值重载operator析构函数返回元素个数…

Python图像识别实战(四):搭建卷积神经网络进行图像二分类(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章)。 从本期开始,我将做一个关于图像识别的…

大疆A3飞控使用|飞控配置

大疆A3飞控使用|飞控配置大疆A3飞控介绍总体特性飞行特性外围设备保护功能SDK拓展拓展功能A3 飞控使用配置连接飞机基本设置机架安装遥控器电调动力配置感度电池控制参数调试基础感度动力带宽高级感度灵敏度控制器性能参数大疆A3飞控介绍 全新A3系列飞控系统结合安全可靠和精准…

【虹科案例】用于超高磁场的虹科 digitizerNETBOX——高采样率和完全同步采样

应用背景 国际 MegaGauss 科学实验室是东京大学固态物理研究所 (ISSP) 的一部分。实验室的目的是研究固态材料(如半导体、磁性材料、金属、绝缘体、超导材料)在超高磁场下的物理特性,这些领域还包括研究新材料并控制其阶段和功能。实验室脉冲…

百度工程师带你体验引擎中的nodejs

作者 | 糖果candy 导读 如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。 Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那…

【Kotlin 协程】Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )

文章目录一、冷流 ( 流被收集时运行 )二、流的连续性一、冷流 ( 流被收集时运行 ) Flow 异步流 的 构建器函数 flow 函数 中的 代码 , 在 调用 Flow#collect 函数 时 , 也就是在 Flow 异步流 收集元素时 , 才会 执行 flow 构建器 中的代码 ; 这种机制的异步流 称为 冷流 ; 代…

移动WEB开发之响应式布局--Bootstrap栅格系统

栅格系统简介 栅格系统英文为“grid systems”,也有人翻译为“网格系统”,它是指将页面布局划分为等宽的列,然后通过列数 的定义来模块化页面布局。 Bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(vi…

spring-statemachine状态机梳理

目录 一、基本回顾 1、为什么要用状态机 2、什么是状态机 3、状态机可归纳为4个要素 4、对应Spring StateMachine的核心步骤 5、简单例子 添加maven依赖 定义状态枚举和事件枚举 完成状态机的配置 简单测试一下 添加Listener 监听器,当状态变更时,触发方…