GIS融合之路(五)番外-山海鲸的体积云又又又升级了

一转眼自上一篇文章已经过去半年之久,承诺的CesiumJS的天气文章竟然又又又又跳票了,没办法。开发任务时间紧,任务重。GIS的进一步整合进入深水区,每向前迈一步都是步履维艰,好不容易把体积雾,接触阴影,云影,眼部适应的功能整合完了,正打算把这篇鸽了半年的天气整合文章给补上。不料突然刷到体积云渲染的祖师爷-Guerrilla Games,也就是《地平线》游戏的制作团队,竟然又在SIGGRAPH 2022和SIGGRAPH 2023发了两篇升级体积云的渲染文章。本着宁可累死自己,也要卷死同行的国际主义精神,必须研究下看看能不能再提升一下山海鲸云层的渲染效果。

看完之后确实感慨国际友人的分享精神。对于一些性能上的提升点,确实需要慢慢消化。同时关于地形云层和风暴云层暂时在孪生和GIS系统中用的还不多,最让我心动的便是这个卷云了。

什么,这个云的名字怎么都这么卷?我们先看看这个云家族中的卷王长什么样子:

卷云

可以看到卷云其实我们在生活中还是非常常见的,特点就是又高又卷,非常符合我们产品的气质。那说干就干,看看如何结合到现有的云层渲染当中。

1.分层渲染

首先从ppt中可以看到,新的算法拆分了两个渲染层,分别是Cirrus Sub-Layer和 Stratus Sub-Layer,其中这个Cirrus Sub-Layer就是我们这次的主角卷云层。

虽说它山之石可以攻玉,但他山之代码那是真不好直接整合,之前写到半死的体积云步进算法如果直接按照这个算法拆分,这个工作量下去怕是又是10杯超大杯的咖啡因都叫不醒了。为了快速整合,我们对这个算法进行简化,在原来的步进过程中取height为最高处10%的采样点作为卷云层的采样点,剩下的90%的高度重映射为100%之后作为原算法的采样输入,这样只需要在采样函数这里做一次分支就可以几乎不动代码的将卷云层加入进来。

2. 卷云层建模

之前的体积云建模核心都是采用3d的Perlin-Worley噪声材质来建模的。卷云层在ppt中被称为2.5d,建模无需3d材质,只需要2d噪声材质即可。作者还贴心的公布了3种卷云的噪声材质,我这里也很贴心的帮大家处理进了一张贴图的三个通道:

卷云的噪声贴图

我测了一个发现这三张贴图竟然都不是无缝贴图,不过似乎也并不影响最终的渲染效果,因此也就不做过多处理了。

贴图处理好之后,就是采样算法了,这个代码ppt里也写了,直接拿来用。

float density = ValueRemap(cloud_type, 0.5, 1.0, ValueRemap(cloud_type, 0.0, 0.5, cr_streaky, cr_wispy), cr_round); 

density = pow(density, 1.0 - ValueRemap(cloud_coverage, 0.0, 1.0, -0.9, 0.9));

density *= ValueRemap(pow(cloud_coverage, 3.0), 0.0, 0.5, 0.0, 1.0);

唯一的问题是山海鲸现在的云层是完全随机生成的,并没有先生成类似他的NDF的文件,因此这里暂时先不处理不同卷云融合的情况,就把三种卷云分开做吧。(将来也许要做云层笔刷,再把这口锅甩给设计)。

3. 卷云层光照

卷云层光照几乎完全复用其他云层光照的代码,唯一的区别就是步进次数可以减少为4次,这里就不再赘述了。

最后看一下整合后的效果,卷云的类型可以选择条纹状,絮装和点状(请原谅我草率的翻译):

条纹状卷云

絮状卷云

点状卷云

再结合之前的体积云效果可以得到更加逼真的天空效果。

积雨云叠加条纹状卷云

虽然通过一定程度的Hack很快速的把卷云整合到了系统中来,也带来了一个小的弊端,就是步进的距离被拉长了,这样当步进步数不够的时候,就会出现非常强烈的闪烁,特别是在地平线附近距离相机很远的地方会非常严重,目前只能通过增加步进步数解决,将来看估计还是得拆分成两个layer进行分别步进才有可能解决这个问题。

最新的卷云功能将在山海鲸可视化4.2.0版本中与大家见面,欢迎大家前往下载体验。

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

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

相关文章

利用docker的LNMP

服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.20.0.30 Docker-php 任务需求 使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台…

Spark---RDD(Key-Value类型转换算子)

文章目录 1.RDD Key-Value类型1.1 partitionBy1.2 reduceByKey1.3 groupByKeyreduceByKey和groupByKey的区别分区间和分区内 1.4 aggregateByKey获取相同key的value的平均值 1.5 foldByKey1.6 combineByKey1.7 sortByKey1.8 join1.9 leftOuterJoin1.10 cogroup 1.RDD Key-Value…

Javaweb的网络投票系统的设计与实现

目的与意义 原始的投票管理基本上是人工操作,效率低下,缺乏方便性,网上投票管理系统运用计算机和其他附加设备,不再需要手工操作,基本上是全自动化,能够节省人力,大大的提高了效率。使投票变得…

【项目管理】CMMI-风险与机会管理过程

1、文档结构 2、风险与机会概率 风险与机会概率指的是风险与机会实际发生的可能性。可以用自然语言术语来映射数字概率范围。下表列出了七段概率分级中自然语言术语和数字概率范围映射关系。注意,用来计算的概率值等于概率范围的中间值取整。有了映射表格的帮助&am…

C++ Primer 6.3 返回类型和return语句 知识点+练习题

C Primer 6.3 返回类型和return语句 无返回值函数有返回值的函数两个错误值是如何被返回的返回类类型的函数和调用运算符引用返回左值列表初始化返回值主函数main的返回值返回数组指针 递归练习题疑问待更新 无返回值函数 用在返回值类型为void的函数中,可以不写re…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中,U盘等移动存储设备已成为数据传输和存储的重要工具。 然而,随着U盘的广泛使用,也带来了潜在的安全风险,如数据泄露、病毒传播等。 因此,对于随时会有数据泄露风险的企业而言,U盘的使用…

深入浅出的说地弹(即地噪声)

1. 什么是地弹,地弹的概念,为何叫地弹 地弹、振铃、串扰、信号反射这几个在信号完整性分析总是分析的重点对象。初学者一看:好高深!其实,感觉高深是因为你满天听到“地弹”二字,却到处找不到“地弹…

使用pandas按照商品和下单人统计下单数据

目录 一:需求描述 二:代码实现 三:注意事项 一:需求描述 最近运营那边给到一个excel表格,是一个小程序用户的下单数据,要以商品为维度,统计用户下单情况,主要是下单的商品总金额&…

DNS解析和主从复制

一、DNS名称解析协议 二、DNS正向解析 三、DNS主从复制 主服务器 从服务器

CAN总线通信详解 (超详细配34张高清图)

CAN总线通信详解 (超详细配34张高清图) 1. CAN总线历史 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求&#…

案例119:基于微信小程序的宿舍管理系统设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【Python机器学习】分类器的不确定估计——决策函数

scikit-learn接口的分类器能够给出预测的不确定度估计,一般来说,分类器会预测一个测试点属于哪个类别,还包括它对这个预测的置信程度。 scikit-learn中有两个函数可以用于获取分类器的不确定度估计:decidion_function和predict_pr…

kubebuilder+code-generator开发k8s的controller

本文记录用kubebuilder和code-generator开发k8s的crd控制器。 概览 和k8s.io/code-generator类似,是一个码生成工具,用于为你的CRD生成kubernetes-style API实现。区别在于: Kubebuilder不会生成informers、listers、clientsets&#xff0c…

【工具栏】jclasslib 插件的安装和使用

1. 安装 2.使用 安装之后 在 view 的 ToolWindows 里也有一个这样的窗口 jclasslib 的主要作用是查看字节码的相关信息 package com.test;public class Test {public static void main(String[] args) {Integer a 1;int b a 2;} }例如我写了一段这样的代码,然后去…

语义分割发展现状

语义分割是对图像中的每一个像素进行分类,目前广泛应用于医学图像与无人驾驶等。从这几年的论文来看,这一领域主要分为有监督语义分割、无监督语义分割、视频语义分割等。 语意分割究竟有什么用呢?似乎看起来没有目标检测/跟踪等应用范围广。…

P1379 八数码难题

题目描述 在 33 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局&…

Linux centos stream9 parted

在Linux中,常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉,是过去我们使用windows时常见的。所支持的最大卷2T,且对分区有限制&#x…

SRM供应商招标采购管理系统(源码)

软件相关资料获取:点我获取 一、SRM供应商在线采购 SRM供应商在线采购是指企业通过互联网平台,实现对供应商的在线招募、选择、关系管理等一系列活动。这种采购方式具有高效、透明、便于管理的特点,能够帮助企业降低采购成本,提…

Vue中v-if与v-show区别详解

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…