小程序[渲染层网络层错误] failed to load image_游戏中水的渲染技术

水的渲染一直是图形学需要解决的问题,本篇博客主要介绍用傅里叶变换算法实现的水反射,也是一种假反射效果,目的是优化效率。实现的效果如下图所示:

8973f00416f2537fc2a72d2e76f1c261.png

使用傅里叶系数来表示地形高度的假反射效果,在我们开发的游戏中使用水着色器,告诉读者我将如何利用引擎处理水的反射,我们自己开发水渲染效果,需要在优化方面考虑,计算每帧渲染时间。我们要处理渲染简化的低分辨率反射地图,因为我们还要渲染对于流动的水平面。算法的实现其实都是源于生活,大家如果平时出去旅游,经常会看到山丘的反射,近处反射的比较清晰,但在远处它只是一个黑色的斑点。试想一下,如果我们能够记录每个水点周围的水面上方的地形的角度,然后我可以在水着色器中使用这个反射光线,它应该是从“天空”过渡到“地形”的点。(Spherical harmonics)球面谐波是一种众所周知的技术,通常用于全局照明。非常简要地总结:每个顶点存储一组预先计算的系数,这允许我们重建击中对象的环境光。这些系数基本上存储从每个方向照射该点的光的映射图。反射/环境光通常是非常低的频率,因此这是这些系数如何包含这么“多”的信息原因。我决定用我引擎中的水尝试类似的技术,每个顶点保存一组小系数,描述地形在水上方围绕该点的每个方向上升的角度。这可以用一个四元系列的系数来描述 - 基本上是球面谐波的2d方程。当在顶点之间插值时,这些傅里叶系数就可以计算出来了,给读者展示一下效果图吧。

871d5fc5f7c842a886b856bd0d4725c6.png

在水上的一个点周围的采样方向上的各种角度。

我们计算每个水顶点的系数,这涉及每个顶点的操作:

1、在点周围选择  k个均匀间隔的采样方向。k的值只影响计算,因此您可以将其设置为一定

的高以实现其仿真度,我目前使用13。


2、对于每个采样方向,执行光线跟踪。一次执行一个高度地图像素,测量水面上方的地形角度。你想要精确的反射取决于你离岸的距离,在本文的示例应用程序中,我目前使用5个像素。如果你的游戏涉及从低水平面的不同的水观察视角,你将需要使用更多(后面更多)。


3、现在我们有一个函数(每2π循环)表示点周围的地形高度。


4、为了获得表示该函数的傅里叶系数,我们需要对每个系数的表达式进行积分计算,确切的表达式可以在网上找到。我使用数值积分,分辨率为400(例如每个函数400个样本),使用的数字仅影响计算。


 5、我计算前8个系数,这个数字直接影响效果的品质和性能。8对我的目的来说肯定够好了,当然我们会尽量降低。

我把我的系数作为16位浮点存储在我的顶点结构中(因此每个顶点占用16个字节)。

在水着色器中,我使用反射向量来确定我设置的角度,代码如下:

float3 reflectionRay = reflect(worldPosition - CameraPosition, normal);float angle = atan2(-reflectionRay.z, -reflectionRay.x) + PI;//这给出了0和2π之间的角度,然后我们能够使用它来查找地形高度。

本文实现的傅里叶评估函数看起来像这样(t是角度):

float EvaluateFourier(float t, float4 coefs1, float4 coefs2){  float4 sins;  float4 coses;  sincos(float4(t, 2 * t, 3 * t, 4 * t), sins, coses);  float value = coefs1.r; // a0  value += coefs1.g * coses.r; // a1  value += coefs1.b * sins.r; // b1  value += coefs1.a * coses.g; // a2  value += coefs2.r * sins.g; // b2  value += coefs2.g * coses.b; // a3  value += coefs2.b * sins.b; // b3  value += coefs2.a * coses.a; // a4  return value;}

方程给了我一个角度,这也是算法与编程结合的函数实现,然后我可以比较水面上的反射光线的角度,以确认我们是否应该绘制天空或反射的地形,目前我只是使用黑色的反射地形,效果似乎满足需求。如果我们想要更好的效果,还可以存储地形的颜色,除了高度。当然这将使所需的数据量增加四倍。

那它是如何工作的呢?您可以查看本文顶部的照片作为示例。这里有一个版本的顶点网格绘制。每个顶点存储16字节的数据在我当前的实现。

d8af51d3c2b10379d658327a0f92c49c.png

上图显示了我使用的顶点分辨率效果。

在水面上使用的法线贴图有助于实现这种假反射效果,实现的效果如下所示:

d7c769c90f888c93144d500b90c7ace9.png

以上实现的效果在性能方面也给读者分析一下,这也有助于读者优化Shader的渲染效果:上面给读者实现了一种假反射,以避免渲染昂贵的反射贴图,因此它需要具有高性能。不幸的是,这需要大量的着色器指令在我当前的实现中评估。atan2约有20条指令。HLSL产生4个标量sincos指令,其实际上每个占用8个指令槽。总共,它为像素着色器添加了约64个指令槽。针对上述问题,我们的下一步任务是找到一种减少指令数量的方法。可以使用atan,然后是正弦和余弦,我可以通过做一些三角取代来减少这一点。或者我可以考虑使用e与虚数的幂的和来评估该系列。当然我们还可以减少系数的数量。另外,我将看到我是否可以存储每个系数在单个字节而不是16位浮点。最后总结一下,对于具有更多不同视图的游戏,这可能不是一个很好的选择。还有这个技术的一个问题是它只反射静态对象,地形,以及你决定在你的射线检测算法中包含的任何其他游戏元素。

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

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

相关文章

pip install 报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in

当python在window环境中通过pip安装pandas报标题这样的错,主要是因为python默认编码格式是:ascii 在https://www.python.org/dev/peps/pep-0100/文章中有介绍 解决方法:在python/lib/site.py中加入 import sysreload(sys)sys.setdefaultenc…

jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准

JDBC概述APIJDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使…

怎样判断电饭锅温度传感器的好坏?_空调温度传感器的作用与检测。

温度传感器是指对温度进行感应,并将感应的温度变化情况转换为电信号的功能部件。我们在练习温度传感器检测代换之前,要先对温度传感器的安装位置、结构特点和工作原理有一定的了解。1、温度传感器的安装位置及结构在空调器室内机中,通常设有两…

【codeforces 507E】Breaking Good

【题目链接】:https://vjudge.net/contest/164884#problem/D 【题意】 给你一张图; 图中有些路是完好的;但有些路还没修好; 先不管路有没有修好; 问你从起点到终点的最短路; 如果最短路上有没修好的路,那么你要把它修好; 而不在最短路上的,如果是完好的路,你需要把它摧毁…

java去掉图片边框颜色_sharp 去除图片边框

trim接受参数是颜色相似度, 并不能指定边框颜色, 所以有可能会误删除内容, 需要注意trim 需要转为buffer或者文件后再次操作, 否则图片信息不变从剪裁效果来看, 精度和速度都是可以的const sharp require("sharp");const path "./html/a.png";const outp…

java mail 不用密码_iPhone 无需越狱,简单给 App 加密码锁

在手机上总有些小秘密,也有些APP不想被打开。由于iOS本身限制,想给APP加上密码锁,一般都是需要越狱才能实现。其实在iOS 12就加入了【屏幕使用时间】,用来更好设置APP使用时间的限额。屏幕使用时间屏幕时间功能可以协助您了解自己…

Java植物名录程序_程序员用Java语言编写多线程应用程序,程序员能控制的关键性工作有两个方面:一是编写线程的_________方法;二是建立线程实例。...

沟通的目的是打造“3G团队”,其中的“3G”具体指:“啊,时间过得真快啊!”中的“啊”活塞与气缸盖、气缸壁共同组成燃烧室,承受气缸中气体的压力,并将此压力通过活塞销和连杆传给食品是指人食用或饮用的成品和原料,以及按照传统既是食品又是( )的物品,但不…

【t090】吉祥数

Time Limit: 1 second Memory Limit: 128 MB 【问题描述】 为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给 每位同学发一张卡片,每张卡片上都有…

spark内存溢出怎么解决_和平精英:更新需要预留6G内存,玩家抱怨手机扛不住,怎么解决?...

嗨,小伙伴们大家好呀!《和平精英》新版本终于来了哈,小伙伴们在22号上午登录游戏,就可以收到更新提示,点击进行更新就好了。或者是在各个应用商店里等待更新推送,也行哦!但是呢,每到…

php 字符串0转换bool_PHP数据类型转换(转)

PHP数据类型转换PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:•(int)、(integer):转换成整形•(float)、(double)、(real):转换成浮点型•(string):转换成字符串•(bool)、(boolean):转换成布尔…

【转】LDA数学八卦

转自LDA数学八卦 在 Machine Learning 中,LDA 是两个常用模型的简称: Linear Discriminant Analysis 和 Latent Dirichlet Allocation, 在这篇文章中我们主要八卦的是后者。LDA 是一个在文本建模中很著名的模型,类似于 SVD, PLSA …

python3安装json库-python库json快速入门

在本教程中,您将学习如何借助示例在Python中解析,读取和编写JSON。 此外,您将学习将JSON转换为dict并将其打印出来。 JSON简介 JSON (JavaScript Object Notation) 是一种用于表示结构化数据的流行数据格式。 常用于服务器和Web应用程序之间传…

python 常量 模块_Python字符串模块的有用常量

示例Python的string模块为与字符串相关的操作提供常量。要使用它们,请导入string模块:>>> import stringstring.ascii_letters:ascii_lowercase和的串联ascii_uppercase:>>> string.ascii_lettersabcdefghijklm…

PAT1132: Cut Integer

1132. Cut Integer (20) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueCutting an integer means to cut a K digits long integer Z into two integers of (K/2) digits long integers A and B. For example, after cutting Z 167334, we…

电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了

到现在小红书视频号功能已经上线快三个月了,越来越多的小伙伴开始拍视频、创作视频笔记,但是对于新接触视频的小伙伴来说,拍摄视频好像是一件很难的事,特别是不清楚该选择什么拍摄设备、不知道怎么剪辑视频,还有如何上…

Codeforces Gym101518H:No Smoking, Please(最小割)

题目链接 题意 给出一个n*m的酒店,每个点是一个房间,要将这个酒店的房间划分成为两块(一块无烟区,一块吸烟区),相邻的两个房间之间有一条带权边,权值代表空气锁的面积,如果把这条边给…

java如何实现服务降级_Hystrix服务降级

## 注意Hystrix默认的服务降级时长是1秒钟.因为网络波动,这个值在正式环境中需要调整一下.## 导入包~~~org.springframework.cloudspring-cloud-starter-netflix-hystrix2.0.1.RELEASE~~~## 启动类~~~package com.like;import org.springframework.boot.SpringApplication;impo…

谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!

emmm......这篇文章的内容非常小白,相信大部分人都会这个基本操作。但是阁主相信还有些妹子操作不来,如果还没有男朋友,那不是铁定不会安装谷歌浏览器插件么?其实“谷歌浏览器插件”这个组合,可以解决很多问题&#xf…

高级技巧之Lambda表达式

1.Lambda表达式简介 其本质上是一种匿名方法,它既没有方法名,也即没有访问修饰符和返回值类型,使用它来编写代码将会更加简洁,也更加易读。 2.使用该表达式需要配置的数据 3.传统java和使用Lambda表达式的对比 0)总结&…

java二维数组两个框代表什么_在java语言中,二维数组的两个中括号[][]分别表示()和()。...

【判断题】一元统计分析是研究一个随机变量统计规律的学科。【判断题】合伙创业的成功率一般低于独资创业的成功率。【单选题】镜检时呈“竹节状”排列的是【判断题】酵母菌的菌落与放线菌的菌落相似。【判断题】木纤维是厚壁细胞的一种,它的化学成份以纤维素为主。( )【判断题…