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

一、大气

首先和光线追踪类似,大气渲染也有类似的渲染公式,在实际处理中也有类似 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。具体来说分四步:
在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言第四版-王爽第1章 基础知识

前言 基础知识 (1)换成bit,1KB1024B,1Byte8bit;1KB1024*8bit,即2的13次方,宽度为13. (2)1个存储单元只能放1个字节,1KB1024B;编号从0到1023. &a…

web前端面试题----->VUE

Vue的数据双向绑定是通过Vue的响应式系统实现的。具体原理: 1. Vue会在初始化时对数据对象进行遍历,使用Object.defineProperty方法将每个属性转化为getter、setter。这样在访问或修改数据时,Vue能够监听到数据的变化。 2. 当数据发生变化时…

书生 浦语大模型全链路开源体系

通用大模型成为发展通用人工智能的重要途径 书生 浦语大模型的开源历程 书生 浦语 2.0体系,面向不同的使用需求,每个规格包含三个模型版本,(7B、20B)InternLM2-Base、InternLM2、InternLM2-Chat。 大模型是回归语言建…

python通过shapely 的 valid 判断aoi图形是否有效

测试aoi坐标: 116.527712,39.924304;116.527123,39.924353;116.52707,39.923985;116.527685,39.92397;116.527712,39.924304 如图所示是一个有效的坐标,使用python代码判断是否有效: 代码: from shapely.geometry import Polyg…

数字孪生|山海鲸可视化快速入门

哈喽,你好啊,我是雷工! 今天继续学习山海鲸可视化软件,以下为学习记录。 (一)新建项目 1.1、打开软件后,默认打开我的项目界面,初次打开需要注册,可以通过手机号快速注册。 点击“新建”按钮,新建一个项目。 1.2、根据项目需要选择一个快捷的项目模板,填写项目名称…

C语言 | Leetcode C语言题解之第1题两数之和

题目&#xff1a; 题解&#xff1a; int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int i 0; i < numsSize; i) {for (int j i 1; j < numsSize; j) {if (nums[i] nums[j] target) {int* ret malloc(sizeof(int) * 2);ret[0] i, ret…

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…

C语言程序与设计——复杂结构

结构体 结构体在C语言中是一种重要的数据类型&#xff0c;或者说是一种用户自定义的相同或不同数据类型的集合。可以帮助我们封装一组相关数据&#xff0c;使其数据呈现更直观。例如我们想要统计一个学校学生的基本信息。可以将一个同学的信息按照如下存储。 typedef struct …

结构化绑定optional(C++基础)

结构化绑定 处理多个返回值的操作&#xff1a;C17提出 之前多返回值喜欢用struct来返回。现在会做成元组&#xff0c;下图中设置C17的版本&#xff0c;不要设置错为C语言标准。 #include<iostream> #include<string> #include<tuple> std::pair<std::st…

【跟着CHATGPT学习硬件外设 | 02】GPIO

文章目录 &#x1f680; 概念揭秘快速入门关键精华 &#x1f31f; 秒懂案例生活类比实战演练步骤1&#xff1a;硬件配置步骤2&#xff1a;软件配置步骤3&#xff1a;发送和接收数据步骤4&#xff1a;处理异常步骤5&#xff1a;优化操作手册硬件设计注意事项配置攻略准备阶段配置…

Docker配置Mysql

1.首页搜索mysql镜像 2.选择对应版本的MySQL&#xff0c;点击pull 3.pull完成以后&#xff0c;点击images&#xff0c;这里可以看到刚刚pull完成的mysql版本 4.打开命令界面&#xff0c;运行命令 docker images ,查看当前已经pull的images 5.运行命令设置mysql docker run -it…

OSCP靶场--Kyoto

OSCP靶场–Kyoto 考点(缓冲区溢出GPO滥用提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.31 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-31 08:08 EDT Nmap scan report for 192.168.216.31 Host …

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

Multi-task Lung Nodule Detection in Chest Radiographs with a Dual Head Network

全局头增强真的有用吗&#xff1f; 辅助信息 作者未提供代码

【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍 文章目录 系列文章目录[TOC](文章目录) 前言一、 Linux 发行版(Linux distribution)介绍二、Centos 虚拟机初始化…

【Linux】socket套接字

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;IP地址和端口号pid和port的关系 &#x1f449;&#x1f3fb;TCP和UDP&#x1f449;&#x1f3fb;网络字节序&…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度&#xff0c;度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时&#xff0c;会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

C++11 shared_from_this学习

最近学习网络变成发现一些C源码库中封装对象时会公有继承enable_shared_from_this&#xff1b; 用一个案例进行说明&#xff0c;案例代码如下&#xff1a; #include <iostream> #include <memory> #include <stdio.h>using namespace std;class C : public…

ComfyUI一直提示transformers需要升级,怎么解决?

&#x1f3a1;背景 最近通过秋叶的启动器使用Comfyui的时候&#xff0c;总是会有个弹窗提示transformers需要升级&#xff0c;你会发现&#xff0c;就算是更新了ComfyUI版本&#xff0c;升级了所有插件&#xff0c;升级了transformers库&#xff0c;这个提示仍然存在&#xff…

【Spring Security】 快速入门

文章目录 一、 身份认证Demo1、创建工程2、代码编写2.1、Controller2.2、Html2.3、application.properties配置 3、启动项目并访问 二、Spring Security 默认做了什么二、底层原理1.概述2.FiltersDelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters 三…