游戏引擎中的大气和云的渲染

news2024/11/26 12:29:44

一、大气

首先和光线追踪类似,大气渲染也有类似的渲染公式,在实际处理中也有类似 Blinn-Phong的拟合模型。关键参数是当前点到天顶的角度和到太阳的角度
在这里插入图片描述

二、大气散射理论

光和介质的接触:

  • Absorption 吸收
  • Out-scattering 散射
  • Emission 自发光
  • In-scattering 其他介质的光散射过来

四种方式累积起来形成RTE公式
在这里插入图片描述

体渲染公式:其实就是RTE公式的导数
在这里插入图片描述

2.1 大气中的真实物理

大气中真实存在两种介质:气体分子和气溶胶分子,前者往往小于太阳光中各种光的波长,而后者一般接近这些波长。
因此散射也分为了两种:

2.2 散射

Rayleigh Scattering(瑞利散射)
当空气中介质尺寸远小于波长的时候(气体分子):

空气中的光是四面八方均匀散射,不太具有方向性
对于越短的波长(蓝紫光),它散射的越远,对越长的波长(红光),散射的越近
详细来说,其散射公式如下:
在这里插入图片描述
其中θ是光散射出去的方向和入射角之间的角度,n是空气折射率。而密度比。ρ \rhoρ 这个数字在海平面上等于1,随ρ ( z ) = exp ⁡ − h / H   \rho(z) = \exp{-h/H},ρ(z)=exp−h/H 呈指数递减

几何部分决定了不同方向光的散射情况不同(但整体差别不太大,而且旋转不变);波长部分表明波长越短,散射越强;密度部分表明了海拔对散射的影响。

这也解释了天空在白天是蓝色在傍晚是偏红的原因:
在这里插入图片描述
Mie scattering(米氏散射)
当空气中介质尺寸接近或大于波长时(气溶胶):

  • 有一定方向性
  • 对波长不敏感

详细来说,其散射公式如下:
在这里插入图片描述
对比瑞利散射,多了几何参数g的影响。
其实际生活影响就是雾和太阳光环:
在这里插入图片描述

2.3 吸收

空气中主要是臭氧和甲烷能够吸收波长的光,比如臭氧吸收红橙黄,甲烷吸收红光。比如海王星上大量甲烷导致其显现蓝色。
实际计算过程中往往假设这些气体是均匀分布在整个大气中的(虽然实际上并不是,比如臭氧集中在大气上层)

三、实时大气渲染

在这里插入图片描述

3.1 预计算LUT

实际计算时,Ray Marching是最常用的方法。其原理主要是依照路径逐步计算累积,如下图:
在这里插入图片描述
其中T就是所谓通透度(密度)
和普通物体的实时渲染类似,预计算也在该领域得到运用,LUT就是一个将许多复杂计算进行预计算保存下来的表格。在通透度方面,一个公式得以提出:
在这里插入图片描述

我们注意到,两个点之间的通透度关系借此只由两个参数决定( h 和 θ )由此,我们可以得到一个关于传播通透度的LUT表。

提出这个公式之后,原来的单次散射公式就可以表示为:
在这里插入图片描述
这里最重要的是一种参数化思想(和上面一样),利用三个参数 η 太阳顶角)、θ (观察顶角)和 ϕ (太阳到观察视角之间水平角度)再加上当前高度 h 表示站在所有点在所有太阳角度下看任何方向的情况。(这三个角都是方位角并进一步通过cos计算得到相应结果( μ s 、μ 以及 v )。我们将这个4D表示存到多个3Dtexture array(其实3D texture的插值更合理)里面方便查询。

因此,我们获得了通透度LUT表和单次散射LUT表,利用这两张表,就可以计算出二次、三次以及更多次散射的LUT表

缺点:

  • 预计算成本很高。首先是多次散射的迭代计算成本高,其次是在移动端没法用。(即使在PC端可能也有很多毫秒甚至一秒,但可能分到很多帧去完成)
  • 没法处理动态环境调整。比如从晴天变成下雨的雾天,此时需要均匀过度,每一帧都要插值计算,所以没法处理。包括艺术家调节参数也不方便
  • 虽然获得预计算表,但单单是去逐像素进行高维的插值查询也是成本很高的(所以经常需要为了效率去下采样)

3.2 简化版

因为上述缺点,一种更简化的多次散射方案被提出,其特点在于认为任何散射都是各向同性的,向所有方向均匀散射,所以对一个介质来说,其所有邻居介质收到来自它的散射能量都是相同的,因而一次散射带来的结果只是整体削减(吸收)了固定百分比。
在这种设定下,多次散射也就单纯变成了一次散射的指数变化(等比数列),而一个介质收到的不同次数的散射总量就是其求和(等比数列求和)。
这样一来,由于极大加快了速度,所以这种方法可以每一帧都进行计算。从而导致原方法LUT参数中的高度 h 以及太阳顶角 η都不需要参与预计算(因为都实时更新了),所以新方法的LUT表中只需要计算出观察的天顶角 θ 和一个水平方向环绕360度的夹角 ϕ (对应原来太阳到观察视角水平方向的夹角)即可。化四维为二维。
再加入相机距离可以进一步获得3D的LUT表来实现ray marching
在这里插入图片描述

四、云的渲染

在这里插入图片描述
Billboard Cloud:
在这里插入图片描述
Volumetric Cloud Modeling
在这里插入图片描述

云渲染从最早学术界的Mesh方法到早起游戏的单纯叠贴图,逐渐发展到了用于3A行业的Volumetric Cloud Modeling。其本身有各种优点:

  • 真实的云的形状
  • 可以实现大尺寸的云
  • 支持动态天气
  • 支持动态的体积光照和阴影

同时也具有一个明显的缺点:

  • 效率低下,成本昂贵
  • 其具体依赖于一个称为Weather Texture的东西,而它由两个部分组成:

天空中云的随机分布:
在这里插入图片描述

  • 云的厚度(从0到1表示)
  • 利用这两个部分就可以实现比如云的移动(对1进行平移)以及厚度变化等

但是单单这样做会导致云的形状变成柱状,所以引入了Noise,比如Perlin Noise(棉絮状噪声)和Worley Noise(细胞结构状)等,先利用低频把云的规则边缘模糊化,再加上一些高频来优化细节。
在这里插入图片描述

实际如何进行渲染呢?Ray Marching。具体来说分四步:
在这里插入图片描述

  • 对每个屏幕像素做射线
  • 在该射线未接触到任何云之前大步前进
  • 碰到云之后密集计算
  • 利用前述方法计算,但进行简化(因为云比较密,所以可以做这个假设)

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

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

相关文章

JUC:ReentrantLock(可打断、锁超时、多条件变量)

文章目录 ReentrantLock特点基本语法可重入可打断(避免死等、被动)锁超时(避免死等、主动)公平锁多个条件变量 ReentrantLock 翻译:可重入锁 特点 可中断可设置超时时间(不会一直等待锁)可设…

关系型数据库mysql(9)主从复制和读写分离

目录 1. 主从复制和读写分离 2. mysql 支持的复制类型 3.架构图 一.主从复制 1.主从复制的定义 2.主从复制的过程 中继日志(Relay Log): 优点: 3.为什么要复制 4.谁复制谁 5.数据放在什么地方 6.主从复制出现的问题 …

面向对象:多态

文章目录 一、什么是多态二、构成多态的条件2.1什么是虚函数2.1如何构成虚函数的重写(原理层面上叫:覆盖)2.2父类指针的调用 三、多态调用父类指针出现的情况四、构成多态的一种特殊情况(协变)五、析构函数构成的多态六…

C++AVL树拓展之红黑树原理及源码模拟

前言:我们之前已经从零开始掌握AVL树http://t.csdnimg.cn/LaVCChttp://t.csdnimg.cn/LaVCC 现在我们将继续学习红黑树的原理并且实现插入等功能,学习本章的前提要求是掌握排序二叉树和AVL树,本章不再提及一些基础知识,防止本文结…

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色,它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换,还是复杂的应用导航,导航栏都能够帮助用户快速找到所需内容,提升用户体验和应用的易用性。 在移动应用…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近,一个之前做的electron桌面应用,需要增加两个功能;第一是读取本地的配置文件,然后记载配置文件中的ip地址;第二就是增加缩放功能; 第一,配置本地文件 首先需要在vue工程根目录中&#xff0…

华为OD机试 - 芯片资源限制(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意:订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发, 用户勾选 “总是保持以上选择,不再询问” 之后或长期订阅,下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…

爬虫的验证码处理

1.我们先进入chrome浏览器的审查页面找到input方法: 为了不少找到一个input,我们ctrlf的方法输入input来查找 看见我们有6个需要输入的参数。 除了上面几个的input参数,我们还需要获取验证码的图片,后续要将字母填入进去。 二.安…

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1)题目描述: 求A^B的最后三位数表示的整数,A^B表示:A的B次方。 2)思路: 一般的思路是:求出A的B次幂,再取结果的最后三位数。但是由于计算机能够表示的数字…

Vue ElementPlus Form、Form-item 表单

Form 表单 由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据,组件升级采用了 flex 布局,以替代旧版本的 float 布局。 典型表单 包括各种表单项,比如输入框、选择器、开关、单选框、多选框等。 在 Form 组件…

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 (增)直接添加放到最后即可。按顺序添加:找到要修改的节点的前一个节点,插入新节点()。(改)要修改的节点修改内容即可。(…

03-MySQl数据库的-用户管理

一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …

Docker:使用MinIO搭建对象存储平台

请关注微信公众号:拾荒的小海螺 1、简述 MinIO是一个基于对象存储技术的开源项目,它可以帮助用户快速搭建起私有的、高性能的对象存储平台。MinIO兼容Amazon S3 API,使得用户可以使用标准的S3工具和SDK来访问和管理MinIO存储的数据。此外&a…

查找--二分查找(Binary Search)

二分查找属于静态查找表,当以有序表表示静态查找表时,查找函数可用折半查找来实现。 查找过程:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

B样条曲线(记录)

B样条曲线的生成靠的两点: 1、控制点 2、基函数 B样条曲线的基函数是一个De Boor的递归表达式[1]: (1) (2) 其中是第个阶基函数。 而B样条曲线可以表示为[2]: (3) 如何理解上式?首先,我们知道,如果一个函数…

高端的电子画册,手机打开你见过吗?

手机阅读的高端电子画册,你见过吗?随着移动互联网的发展,越来越多的人选择在手机上阅读电子画册,而不是传统的纸质画册。这种趋势不仅节省了纸张资源,还提升了阅读体验。用户可以通过触摸屏幕、放大缩小、翻页等操作与…

【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

区块链浏览器概述 区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据,然后使用数据库来排列搜索到的数据,并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项,然后通过数据库上…

empdll文件安装在哪里,详细的修复教程分享

在我们运行《荒野大镖客2》游戏的时候,有些玩家在游玩过程中可能会遇到emp.dll文件丢失的问题。此文件作为游戏运行过程中不可或缺的动态链接库(DLL)组件之一,丢失会导致游戏无法正常运行。小编将介绍5种解决emp.dll文件丢失的方法…

linux安装Zookeeper的详细步骤

1.Java环境确认 确保已经安装了Java环境,没有的自行安装 2.官网下载包 Apache ZooKeeper 3.安装 3.1上传到linux,解压 我的目录为/root/apache-zookeeper-3.8.4-bin 进入到/root/apache-zookeeper-3.8.4-bin/conf目录下,执行命令复制zoo…