ue4网格转地形_【魔改UE4】Rtx实时焦散的一次尝试
这篇文章是这个系列最后一篇啦,前情回顾:
未名客:【魔改UE4】Realtime DynamicSkyLight_关于动态天空光照的一次尝试zhuanlan.zhihu.com
未名客:【魔改UE4】Rtx水面半透明反射的一次讨巧尝试zhuanlan.zhihu.com
有了动态的天空,动态的水面反射,距离心中想的比赛作品还差最后一个最大的挑战,那就是可以互动的实时焦散。UE4 连水都没有,更别提焦散,所以这部分内容完全得靠自己。
在组里其他小伙伴的帮忙下,在比赛距离比赛截止还剩不到4天的时间,完成了效果原型。因为涉及到一些项目内部的信息,所以目前这篇文章只对我认为可以放出的内容,稍微点一下。据说NV 有意要把焦散的实现给UE4,那到时候再给大家做具体的分析。
当然,NV 也在18年GDC 上给出了焦散相关的信息,有兴趣的小伙伴可以到这里查看:
https://www.youtube.com/watch?v=l-wTZLjhZ5Y&feature=youtu.bewww.youtube.com
这篇文章,我将分享下面的内容:
- 游戏里面最常用的焦散场景?实时可交互的焦散是什么样的?
- 水面焦散的原理【水面上下,水的反射折射】。
- 游戏里面常规的焦散如何做,如何使用RayTracing 实现焦散【只分享过程部分截图,不会涉及具体代码】。
废话不多说,这就开始。
1、什么是焦散?
游泳池里面的焦散效果最常见了,这些跟着水面一起晃动的亮斑,其实就是这里所谓的“焦散”,它们会出现在水底,也会出现在水上,岸边天花板都有。
游戏里面,传统的焦散,一般是通过某些专业软件,导出一个焦散序列,然后通过uv动画来制作的。
- 优点:效率快,效果可以控制。
- 缺点:无法交互。
NV 在推他的RayTracing就一直提到 焦散,那么这个实时的焦散张啥样?
其实远的不说,就拿国产游戏Rtx来说,《逆水寒》、《剑网三》都曾指出自己实现了rtx 焦散。因为剑三已经正式交付到玩家手里,我以《剑网三》为例说明。
jx3_caustic_realtime.wmvhttps://www.zhihu.com/video/1191764443942563840
以上画面是从剑网三正式服蓬莱场景截取的,可以看出,当你在水里跑动的时候,焦散会跟着一起动。这便回答了上述的问题啦。
2、焦散原理
关于焦散的原理的准确阐述,大家可以看上面NV 的Gdc 视频,也可以查一下。我这里说一下我们游戏里面,要实现的水面这个焦散的大致情况。
其实说的通俗简单一点,对于水面,我们并不是是为了焦散而去做焦散,真正要做的是,模拟光线从空气进入水面后发生的一些事情。
由上面那张图可以看到,光线打到水面上的一个点,会根据水面的发现发生反射和折射。当一束平行光线过来,因为水面并不平,反射以后的光线并不是平行的,会朝着各个方向继续传播,当他们碰到下一个平面,很多光子聚集到一起,就形成了一系列的“亮点”,远距离看起来,这些亮点看上去,有了形状,就是我们所说的由于反射,而产生的水面上面的焦散了。折射产生的水下焦散也是这个道理。
- 反射形成的焦散会打到水面的上方。
- 折射形成的焦散会达到水面的下方。
3、焦散的实现
我们知道,在RTX 的框架下,处理这种已知位置和方向的射线求交是非常方便的。其实焦散的实现非常方便,实际代码和反射非常相似。只不过,反射是一个像素被动的去计算一个像素被反射到的颜色,而焦散则是主动发出射线去照亮场景。
简而言之,一共有下面三个步骤:
- 【光栅化】绘制水面,得到水面位置和法线信息。
- 【RayTracing】做射线求交,得到求交结果。
- 【光栅化,可选】根据实际情况,选择是否绘制Caustic 网格。
值得注意的有两点:
- 焦散 实际是通过RayTracing 和 光栅化共同完成的结果。
- 第三步是可选的,当发出的射线不够多时,点亮场景的点非常散,没办法聚成一定的形状。这个时候就需要通过降噪的手段来处理这些噪点了。当然,如果只是一个为了一个制作一个效果原型,不扣细节,我们可以选择要不加多射线,也有一个很讨巧的办法,把这些点实时导出,拼成三角形,CS计算三角形的面积,决定三角形的亮度,最后在PS 里面三角形画出来即可。
此外,要想实现一个非常漂亮的焦散效果,对水面的法线要求很高。最终焦散的效果是来自水面法线的,这也是美术控制焦散最主要的方式。
综上所述,焦散的具体实现步骤:
- 【光栅化】 正交绘制水面,RT 为水面的世界坐标和法线。
- 【RayTracing,GenRay】根据屏幕上一个像素水面的法线,和光线的方向,计算反射、折射方向。
- 【RayTracing,DispatchRay】沿着这两个方向,主动像场景发射射线。
- 【RayTracing,HitGroup】当碰到场景时,计算这一点在屏幕上的坐标,把SceneColor 上对应的点 点亮,降噪,使场景颜色平滑干净。
- 【RayTracing,HitGroup】必要时,不做第4步,直接导出碰到的世界坐标点,和其他关心的信息。
- 【CS】拼接三角形,根据三角形面积,计算三角形亮度强度。
- 【光栅化】GS 剔除不符合的三角形,PS 绘制三角形,完成焦散。
下面做一个简单的概述,以及我部分完成的情况,供有兴趣的小伙伴参考:
3.1 正交绘制水面,得到水面世界坐标,和法线的信息
这一步在最开始的时候,我是新建了两个和屏幕一样大小的RT,从主相机的角度透视拍水面的。这么做确实很方便,不用管理相机,但是它的问题是,首先会浪费很多像素,其次精度不够,会出现摩尔纹以及各种莫名其妙的问题。
最终决定使用正交相机。
如果是使用正交相机,在水面正上方,垂直向下拍,那么得到的世界坐标,及法线精度是足够的了。
为了方便演示,我仅仅使用一张法线贴图,和一个平面来表示水面,机器波动。
如图所示,图里是个非常简单的场景,只有一块儿水面,2张rt,分辨率是512*512,分别记录了水面的世界坐标,和压缩过的法线。
3.2 RayTracing,点亮场景
一开始,因为reproject 到屏幕上 计算错误,出了下面的一些问题,没办法打到正确的场景物件上,立起来了:
https://www.zhihu.com/video/1191774046361186304
后来改正reproject 以后,得到了和想象中非常接近的效果
好是好,但是正如上文提到的,这么做存在精度问题。
UE4的原现场有点久远了,我用一个独立的小demo 演示一下它的问题。
https://www.zhihu.com/video/1191775655585521664
好了,最后在同事帮忙下,开始转正交做。有了如下结果。
在RayTracing 这一步,我一开始是直接一个点一个点打亮场景的,结果发现发出的射线不够多,出来很多小点点:
3.3 失败的降噪
降噪这部分,我只知到可以通过每帧随机数 + taa 的方式 来做时间上的降噪。对空间降噪算法不是很了解。
一开始试图通过降噪来处理这些点,并没有得到非常好的结果。眼看比赛截止时间临近,最后在同事的讲解下,开始考虑第二种方法,点云拼接三角形。
3.4 点阵 拼接三角形,回头走光栅化流程
在上面的rtx 步骤中,实际上并没有对SceneColor 做任何操作,而是输出了 世界坐标和一些其他参数的Buffer。
世界坐标buffer 直接作为VertextBuffer,走光栅化流程~
上图展示了大致的结果,已经非常非常接近最终结果了。
接下来,就是把根据亮度筛选三角形,通过一个CS,计算三角形面积,得出三角形的亮度强度,再走GS ,剔除不符合要求的三角形,最终就能得到下面的结果啦~
标题图get~
ok,基本到了这一步,整个焦散的实现过程就算完成了,当然中间有很多可以添加参数,给美术控制的地方,我这里就不方便说太多了~
好的,焦散部分就说到这里了,这个系列的三篇文章也按照预期更新完了。小伙伴们,有缘再见~
ue4网格转地形_【魔改UE4】Rtx实时焦散的一次尝试相关推荐
- ue4网格转地形_翼翻 在UE4中完成灯塔场景制作
Hello~大家好 今天给大家带来一篇UE4的场景工作的图文 本图文来自英国的环境艺术家Craig Richards 介绍我叫Craig Richards,我是英国的环境艺术家.我第一次涉足电子游戏艺 ...
- ue4网格转地形_不用建模就能生成地形,SU怎么办到的?!
有什么方法可以不建模 直接生成真实好看的地形呢 这里强烈安利这款神器 位图转模型 ▼ 位图转模型 位图转模型 高程着色 坡度着色 插件介绍 位图转模型 SUAPP编号186 作者:thomthom 插 ...
- ue4光追降噪_【魔改UE4】后记_焦散效果总结
我了解的的焦散共有三种做法: 贴图动画 实时焦散:Normal 挤出网格[我感觉非常漂亮,可以低成本模拟rtx效果] 实时焦散:rtx,主动点亮场景 以UE4 为例. 一.贴图动画 UE4 有一个实例 ...
- ue4网格转地形_UE4 山脉风景地形模型
UE4 山脉风景地形模型 这套"风景地形"包括非常详细的山地背景.这些山脉将有资格参加下一代游戏. 这个包包含27个模块化山脉和11个全地平线(360度)山脉.每个设置都有自己的一 ...
- 西瓜大作战java 源码_魔改和上线你的合成大西瓜,最全教程!
本文是从 0 到 1 的教程,让小白也能够魔改和上线发布属于你的合成大西瓜! 最近,一款名为『 合成大西瓜 』的游戏突然火了!看来真的是大家吃瓜吃太多了,这个小游戏深抓人心! 当然,游戏本身非常有趣, ...
- ue4网格转地形_UE4荒凉海岛灯塔场景制作/译文
设为星标,不错过任何干货 先点上方" CG自学站"再点右上角" ..."最后设置星标★ CG自学站专注分享国内外CG教程和大师名家推介 专业词汇翻译疏漏某些请理 ...
- ue4网格转地形_UE4教程:创建地形材质
文件夹设置 完成地形的造型后即可为其添加材质,使其与现实世界中的地形相似. 在执行操作之前应先对文件夹进行设置,以便存储创建和迁移的内容. 在教程的此部分中,我们将创建以下四个文件夹. 如需了解在虚幻 ...
- 3 魔改_魔改启动!《战地3》非官方MOD工具即将发布
VU团队近日宣布,<战地3>非官方MOD工具将于2020年12月发布.团队还公布了一段宣传片,展示了用MOD工具制作的一些自定义地图. VU(Venice Unleashed)是致力于对& ...
- 代码已开源,一起魔改大西瓜!
上了两次微博热搜的<合成大西瓜>,想必大家都玩过了,好多人刚开始嗤之以鼻,最后真香了,说实话有点上头. 其火热程度直登热搜第三,阅读量6.9亿,朋友圈里也在纷纷安利. 合成大西瓜 游戏界面 ...
最新文章
- JS中fori和forEach跳出循环的问题
- 如何选择主机操作系统?
- 甲骨文中国公司如何如何打赢这场裁员翻身仗?
- log4j配置日志系统成功 (转)
- 8大行业场景!最新 Apache Flink 行业案例集火热出炉
- BZOJ 1016 最小生成树计数 【模板】最小生成树计数
- tensorflow2 训练和预测使用不同的输出层、获取权重参数
- UVa 10400 记忆化搜索
- C#多线程的用法2-线程的生命周期
- Brute Force(暴力算法)
- PCI Express Base Specification Revision 3.0 英文手册 免费下载
- vue 电视看板_基于Vue的拖放看板
- 《视觉slam十四讲》第3讲课后习题
- Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像
- python 使用摄像头监测心率
- Debian 执行apt-get update失败提示:请使用 apt-cdrom,通过它可以让 APT 识别该盘片。apt-get upgdate 不能被用来加入新的盘片
- openjudge 1.3.10 计算并联电阻的阻值
- commander、ora、chalk、inquirer使用
- 软考高项——【项目进度管理】
- 基于磁阻传感器的断路保护装置设计