漂浮岛场景WebGL效果解析

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

场景构图

该场景使用了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.hqwc.cn/news/94895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov5模型转换

yolov5本身release目录有提供了onnx转换好的模型,想着也自己操作一遍,可是实际操作却遇到了问题,这里做下记录方便后续可能用到 安装onnx,转的时候提示出错ONNX: export failure 0.1s: Unsupported ONNX opset version: 17 修改…

Android 13 - Media框架(9)- NuPlayer::Decoder

这一节我们将了解 NuPlayer::Decoder,学习如何将 MediaCodec wrap 成一个强大的 Decoder。这一节会提前讲到 MediaCodec 相关的内容,如果看不大懂可以先跳过此篇。原先觉得 Decoder 部分简单,越读越发现自己的无知,Android 源码真…

Linux 多进程解决客户端与服务器端通信

写一个服务器端用多进程处理并发,使两个以上的客户端可以同时连接服务器端得到响应。每当接受一个新的连接就fork产生一个子进程,让子进程去处理这个连接,父进程只用来接受连接。 与多线程相比的不同点:多线程如果其中一个线程操…

中科驭数以DPU先进计算技术,夯实下一代金融IT基础设施底座

由中国计算机学会主办的第19届CCF全国高性能计算学术年会(CCF HPC China 2023)于8月23日至26日在青岛成功召开。在“高性能金融计算”主题论坛上,中科驭数高级副总裁、CTO卢文岩应邀发表了题为《DPU先进计算技术助力下一代交易底座》的演讲&a…

漏洞修复:在应用程序中发现不必要的 Http 响应头

描述 blablabla描述,一般是在返回的响应表头中出现了Server键值对,那我们要做的就是移除它,解决方案中提供了nginx的解决方案 解决方案 第一种解决方案 当前解决方案会隐藏nginx的版本号,但还是会返回nginx字样,如…

Vue3实现可视化拖拽标签小程序

介绍 实现功能&#xff1a;可视化标签拖拽&#xff0c;双击标签可修改标签内容 HTML结构 <div class"box" v-move><div class"header">标签1</div><div dblclick"startEditing" v-if"!isEditing">{{content…

windows 2012服务器配置nginx后无法访问域名的问题

环境&#xff1a;Windows 2012 R2 Nginx 问题&#xff1a;确认域名解析到服务器ip已生效&#xff08;通过ping域名地址确认域名已指向该ip&#xff09;&#xff0c;确认nginx配置无误&#xff08;绑定域名、配置端口、配置网站文件目录&#xff09;&#xff0c;但无法从外网访…

自动化运维:Ansible之playbook基于ROLES部署LNMP平台

目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…

A 股个股资金流 API 数据接口

A 股个股资金流 API 数据接口 全量股票资金流数据&#xff0c;全量A股数据&#xff0c;最长30日历史数据 1. 产品功能 支持所有A股资金流数据查询&#xff1b;每日定时更新数据&#xff1b;支持多达 30 日历史数据查询&#xff1b;超高的查询效率&#xff0c;数据秒级返回&am…

MongoDB实验——在MongoDB集合中查找文档

在MongoDB集合中查找文档 一、实验目的二、实验原理三、实验步骤1.启动MongoDB数据库、启动MongoDB Shell客户端2.数据准备-->person.json3.指定返回的键4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch&#xff08;匹配数组&#xff09;5.OR 查询 $or6.Null、$exists7.…

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小&#xff08;代价&#xff09;生成树时&#xff0c;可能是Kruskal算法第2次选中但不是Prim算法&#xff08;从v4开始&#xff09;第2次选中的边是&#xff08;C&#xff09; A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …