漂浮岛场景WebGL效果解析

news2025/1/25 9:23:11

访问在线地址,代码在此处。

场景构图

该场景使用了3个岩石模型,一些通用的阙类植物、树木模型,还有空中的鸟类模型。

场景的渲染顺序:深度预通道,岩石,鸟类,天空,云粒子。
1_x1lNILGL3C-JzpJ8WN4boA.gif

相机路径和物体放置

为了能造成一种无尽的随机场景的效果,有两种选择:真正的随机场景和循环生成的路径。第一种需要将对象动态放置在相机前面,但是这意味着这些位置必须动态传输到 GPU。因此,更好的选择是生成一次静态循环的路径,并在相机移动时沿其路径绘制对象。

可以在 ObjectPlacement.ts 文件的positionOnSpline函数中找到用于生成基本样条线的函数。它为具有动态变化半径的相机创建一条环形路径。应用几个谐波来随机化圆半径,因此它看起来虽然是随机的,但仍然是比较完美的循环路径。然后,所有物体都放置在这条路径周围:树木位于相机下方,岩石位于上方和两侧。

对象的位置和旋转以 GPU 纹理的形式存储在类型化数组 Float32Array 中。

Renderer.ts 中的 drawInstances 方法渲染仅从样条线上的某个点可见的对象。由于场景简单,无需使用视锥体剔除(对象是在相机前后一定距离处绘制的)。此可见距离略大于雾开始距离,因此新对象看起来完全被雾覆盖并且不会出现。实例是从前到后排序的,因此在绘制时它们会使用 Z 缓冲区剔除。

只有岩石和树木模型才会以这种方式沿着相机路径放置。鸟群使用特定的线性路径,并能以最少的路径覆盖场景的整个区域。

以下是可视化的相机路径,仅在其附近渲染了一部分对象:
1_tb9w5J2ws0G96MzS5_jhBw.gif

雾效立方体贴图

最初的实现是使用了颜色均匀的雾,但是看起来相当普通。为了添加更多来自不同方向的颜色变化(例如太阳光晕),我们决定使用立方体贴图来实现雾效,这样我们可以通过创建立方体贴图并调整场景预设中的几种颜色来完全改变整个场景的外观。如果是一张全景贴图的话,我们可以使用数字孪生平台的全景图转盒子贴图工具将全景图图像转换为 6 个立方体贴图,然后调整它们的旋转以适合我们的坐标系 (Z-up)。

可以在 FogShader.ts 的静态常量中找到立方体贴图雾的实现。所有雾着色器都使用它们。顶点着色器用于颜色混合的最终雾系数,也包含高度雾系数。

在Web演示用户界面中,可以调整不同的雾参数: 起始距离(fogStartDistance)、过渡距离(fogDistance)、高度偏移(fogHeightOffset)和高度乘数(fogHeightMultiplier)。此外,更改一天中的场景时间是通过为每个预设使用不同的立方体贴图纹理和几种颜色来完成的。

岩石上的草

为了让岩石不那么突兀,我们还在它们上面应用了草的纹理。该技术通常用于模拟被雪覆盖或被雨水浸泡的表面。草纹理与基于顶点法线的岩石纹理混合。可以使用 UI面板 中的grassAmount 滑块来查看它如何影响草在岩石上的分布。

在岩石顶部应用草纹理的着色器的源代码位于 FogVertexLitGrassShader.ts 中。

云的渲染

云不是实例化的,而是逐个绘制的,因为这些对象的变换矩阵必须调整为始终面向相机。它们的数量并不多,因此不会添加太多的draw call。实际上,如果 GPU 状态未更改(未更新uniform、切换混合模式等),那么即使是非实例渲染在现代移动和桌面 GPU 上也相当快。

这个着色器还有一个小技巧。当相机飞过云层时,它们可能会被近剪裁平面突然剔除。为了防止这种情况发生,应用了一个简单的_smoothstep_来实现在相机前面淡入淡出。可以在 FogSpriteShader 中找到代码。

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

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

相关文章

机器人中的数值优化(六)—— 线搜索最速下降法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

Python|小游戏之猫捉老鼠!!!

最近闲(mang)来(dao)无(fei)事(qi),喜欢研究一些小游戏,本篇文章我主要介绍使用 turtle 写的一个很简单的猫捉老鼠的小游戏,主要是通过鼠标控制老鼠(Tom)的移动,躲避通过电脑控制的猫(Jerry)的追捕。 游戏主体思考逻辑&#xff1…

良品铺子聚焦高品质,打造零食王国

出品| 大力财经 文 | 魏力 8月29日,休闲食品企业良品铺子发布2023年半年报显示,实现营业收入39.87亿元,归母净利润1.89亿元。 值得注意的是,在全球经济增速不强的背景下,良品铺子上半年,新开店323家&#…

孙哥Spring源码第15集

第15集 BeanPostProcessor、BeanFactroyPostProcessor 【视频来源于:B站up主孙帅suns Spring源码视频】 1、Spring预先给我们提供的PostProcessor的有哪些 是怎么来的? 2、Spirng中非常重要的扩展点 BeanPostProcessor 和BeanFactoryPostProcesor Aut…

IA-SEG项目中DIAL-Filters(IAPM模块+LGF模块)使用解读

IA-SEG项目源自论文Improving Nighttime Driving-Scene Segmentation via Dual Image-adaptive Learnable Filters,其核心就是在原有的语义分割模型上添加了DIAL-Filters。而,DIAL-Filters由两部分组成,包括一个图像自适应处理模块&#xff0…

正运动携手EPLAN,以高效的电气设计助力运动控制的数字化设计

随着智能制造行业的快速发展,仪器仪表自动化的需求也越来越高。为了提高生产效率,降低成本,许多企业开始寻找一种集成电气、控制和数据管理的解决方案。 正运动技术作为国内领先的的运动控制和数字化解决方案供应商,已经来到前沿…

【Spring专题】Spring之事务底层源码解析

目录 特别声明前置知识Transactional简单介绍*Spring事务传播类型(非常重要)Transactional使用示例分析示例一:常用示例二:发生异常回滚示例三:try-catch【经典】示例四:REQUIRES_NEW,没有捕获异…

VS2019编译curl库

下载: curl-7.61.0.tar.gz 编译: 解压到一个文件下,然后右键以管理员权限运行buildconf.bat 编译x64的库使用的是x64 Native Tools Command Prompt for VS 2019 本机工具命令提示,如果想编译x86的库,可以选择x86 Nat…

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中,我们研究了学习图卷积网络(GCN)回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…

逆向工程-架构真题(二十)

结构化程序设计采用自顶向下、逐步求精及模块化程序设计方法,通过()三种基本控制结构可以构造出任何单入口单出口程序。 顺序、选择和嵌套顺序、分支和循环分支、并发和循环跳转、选择和并发 答案:B 解析: 结构化设…

Ubuntu学习---跟着绍发学linux课程记录(第二部分)

文章目录 7 文件权限7.1 文件的权限7.2 修改文件权限7.3 修改文件的属主 8、可执行脚本8.2Shell脚本8.3python脚本的创建 学习链接: Ubuntu 21.04乌班图 Linux使用教程_60集Linux课程 所有资料在 http://afanihao.cn/java 我自己的ubuntu系统 账号:jiaoyidi 密码&a…

Nginx的配置及优化2

nginx的配置文件 一、nginx配置文件1.1、主配置文件详解1.2、子配置文件 二、修改启动程序的全局配置2.1、修改启动的工作进程数优化2.2、cpu与eorker process绑定优化2.3、PID路径优化2.4、修改工作进程的优先级 优化2.5、调试工作进程打开文件的文件个数2.5.1、基本原理2.5.2…

LPDDR4、DDR4

核心信息: 2400Mbps(每秒传输2400*1百万bit) 2400MT/s(百万次/秒) 信号

leetcode - 360周赛

一,2833. 距离原点最远的点 这道题的意思是,遇到 "L" 向左走,遇到 "R" 向右走,遇到 "_" 左右都可以走,那么要想找到距离原点最远的点,就是在找 | "L" "R&qu…

Kafka知识点总结

常见名词 生产者和消费者 同一个消费组下的消费者订阅同一个topic时,只能有一个消费者收到消息 要想让订阅同一个topic的消费者都能收到信息,需将它们放到不同的组中 分区机制 启动方法 生成者和消费者监听客户端

OpenCV C++案例实战三十三《缺陷检测》

OpenCV C案例实战三十三《缺陷检测》 前言一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型 三、图像配准3.1 功能源码3.1 功能效果 四、多元模板图像4.1 功能源码 五、缺陷检测5.1 功能源码 六、效果演示总结 前言 本案例将使用OpenCV C 进行PCB印刷缺陷检测…

c++二叉树遍历

目录 二叉树节点结构: 1.1 前序遍历(Preorder Traversal): 递归实现(preorderRecursive函数):首先访问当前节点,然后递归遍历左子树,最后递归遍历右子树。这种遍历方式…

【Mycat 2】详解分库分表设计方案及实操测试(二)

文章目录 4. 分表、不分实例、不分库4.1 数据分片映射关系4.2 测试过程5. 分实例、分表、不分库5.1 分库键和分表键相同5.1.1 数据分片映射关系5.1.2 测试过程5.2 分库键和分表键不相同5.2.1 数据分片映射关系5.2.2 测试过程6. 不分片6.1 普通表6.1.1 数据映射关系6.1.2 测试过…

Java智慧工地信息化管理平台源码,依托计算机信息、网络通讯、物联网、系统集成及云计算技术建立

Java智慧工地源码 智慧工地APP源码 系统定义: 智慧工地信息化管理平台是依托计算机信息、网络通讯、物联网、系统集成及云计算技术,通过数据采集、信息动态交互、智能分析,建立起来的一套集成的项目建设综合管理系统。实现项目管理信息化、网…

自定义TimeLine实现卡拉OK轨

系列文章目录 自定义TimeLine 自定义TimeLine 系列文章目录前言正文UI部分代码部分Data(数据)Clip(片段)Track(轨道)Mixer(混合)被控制物体 总结 前言 自定义TimeLine实际上就是自定…