更精确SSR的交点检测
Unreal的SSR交点检测
关于 屏幕空间反射,可以参考文章很多,我觉得这篇写得还是蛮好的:Screen Space Glossy Reflections,借个图用用:
本文不考虑 粗糙度,也不考虑 多条反射射线,只借鉴一下 Unreal 引擎在处理 单条射线光线步进 时对 交点 的计算方式,用来改进我的插件 LWRP/URP SSR Water 的反射表现。
直接看下面这段最简单的 光线步进 代码片段:
#if SCALAR_BRANCHLESS float MinHitTime = 1;float LastDiff = 0;float SampleTime = StepOffset * Step + Step; UNROLLfor( int i = 0; i < NumSteps; i++ ){float3 SampleUVz = RayStartUVz + RayStepUVz * SampleTime;// Use lower res for farther samplesfloat Level = Roughness * (i * 4.0 / NumSteps) + HZB_LEVEL_OFFSET;float SampleDepth = Texture.SampleLevel( Sampler, SampleUVz.xy, Level ).r;float DepthDiff = SampleUVz.z - SampleDepth;bool Hit = abs( DepthDiff + CompareTolerance ) < CompareTolerance;// Find more accurate hit using line segment intersection float TimeLerp = saturate( LastDiff / (LastDiff - DepthDiff) ); float IntersectTime = SampleTime + TimeLerp * Step - Step; float HitTime = Hit ? IntersectTime : 1;MinHitTime = min( MinHitTime, HitTime );LastDiff = DepthDiff; SampleTime += Step; }float3 HitUVz = RayStartUVz + RayStepUVz * MinHitTime;Result = float4( HitUVz, MinHitTime );
这里有一句比较有意思的注释:
Find more accurate hit using line segment intersection
在判断出射线和场景相交后,Unreal 并不着急返回 当前射线终点 对应的 屏幕坐标,而是根据上一段射线终点和当前射线终点相对于场景深度的偏移 插值 出一个更加准确的 屏幕坐标。
有点绕口,画个图就明了了:
上图显示的是射线深度刚超过场景深度时的情形,图中 CurrentDiff 是正数,LastDiff 是负数,如果考虑正负号,则交点的屏幕坐标计算公式如下:
HitScreenUV = lerp(LastScreenUV, CurrentScreenUV, -LastDiff / (CurrentDiff - LastDiff)))
上面代码中的 LastScreenUV 即上一段射线终点对应的 屏幕坐标,CurrentScreenUV 即当前射线终点对应的 屏幕坐标。
把 -LastDiff / (CurrentDiff - LastDiff) 的分子分母都 乘以-1 即:
HitScreenUV = lerp(LastScreenUV, CurrentScreenUV, LastDiff / (LastDiff - CurrentDiff)))
这样就和 Unreal 的代码对应上了。
效果对比
我在 LWRP/URP SSR Water 的光线步进交点计算中并没有上面的 插值 操作,而是判断出相交后直接返回当前射线终点对应的屏幕坐标。
配合 抖动,在 采样Step数 和 屏幕分辨率 比较高时,这样的做法表现其实也还不错。
不过,当我把分辨率调到 1200 x 600 时,之前的表现就一般般了,如下图:
添加插值后,还是 1200 x 600 的分辨率,表现就好多了:
如果把分辨率提到 2160 x 1080 这种常见的手机分辨率,表现就更好了:
做为一个水的shader,这样就差不多了,因为加上水波纹后,一切都是浮云:
个人主页
本文的个人主页链接:https://baddogzz.github.io/2020/03/06/Accurate-Hit/。
好了,拜拜!
更精确SSR的交点检测相关推荐
- mAP提升40%!YOLO3改进版—— Poly-YOLO:更快,更精确的检测和实例分割
本文转载自AI深度视线. 精彩内容 YOLOv3改进版来了!与YOLOv3相比,Poly-YOLO的训练参数只有其60%,但mAP却提高了40%!并提出更轻量的Poly-YOLO Lite,还扩展到了 ...
- Poly-YOLO:更快,更精确的检测(主要解决Yolov3两大问题,附源代码)
点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨Edison_G 来源丨计算机视觉研究院 论文地址:https://arxiv.org/pdf ...
- rcm认证_这款小型rcm可以更精确地执行外科手术
rcm认证 Harvard researchers drew upon inspiration from the Japanese art of Origami to develop this inn ...
- 商业智能让营销更精确
大数据背景下的驱动,让越来越多的行业和企业关注数据挖掘分析,其实,商业数据用于营销早在数十年前就展开了. 著名的美国百货公司少女怀孕案例,利用顾客的购买记录数据,推测出少女怀孕,然后向其推荐一系列孕妇 ...
- 公交导航准确度大PK:高德地图百度地图谁更精确
万物复苏.春意盎然的春天,正是四处赏春踏青的好时节.但踏青景点经常堵车怎么办?坐公交啊!随着政府对公共交通体系的大力支持,绿色出行不仅成为广大市民上班通勤的新常态,也是出游的好帮手.那么,该怎么才能更 ...
- 回顾︱DeepAR 算法实现更精确的时间序列预测(二)
deepAR已经上线Amazon SageMaker +GluonTS,有AWS的站台 + 本身的灵活性,实操可行性还是蛮高的.模型本身可以加入一些额外的属性信息,同时可以输出点预测 + 概率预测. ...
- Network Delay Simulator模拟延时、带宽甚至丢包率,更精确地模拟慢网速环境
Network Delay Simulator 免费软件,下载地址 .我正在使用的,三种之中功能最强大,监听Network Interface Card (NIC)和TCP/IP stack之间的网络 ...
- GPS北斗授时服务,NTP让网络时钟同步更精确
GPS北斗授时服务,NTP让网络时钟同步更精确 GPS北斗授时服务,NTP让网络时钟同步更精确 1.时间同步技术必定将是整个大数据处理系统的重要支撑和保障.时间同步技术使数据产生与处理系统的所有节点具 ...
- 用劳斯判据计算系统几个精确的虚轴交点
用劳斯判据计算系统几个精确的虚轴交点 vpa函数控制精度 format long syms K s51=1; s52=39; s53=2*K+24; s41=11.4; s42=K+43.6; s43 ...
最新文章
- R语言dplyr包distinct函数去除重复数据行实战
- 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](5)
- linux网络编程之inet_pton和inet_ntop函数
- 《Python Cookbook 3rd》笔记(1.9):查找两字典的相同点
- git 部分常用命令记录
- [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程...
- 完美解决banner图片适应分辨率不同的问题
- IDEA创建javaweb项目,及常见的请求和响应头
- 颠覆式创新看世界,读《第二曲线创新》有感
- 松翰单片机定时器c语言,松翰T0 定时器中断
- 今天给大家分享的案例就是关于电影的啦,我们一起来看看IMDBtop10000的电影排行榜数据
- 最全英豪工具箱(LvyhTools)PPT插件教程(前篇)
- 苹果7更新系统后显示无服务器,苹果手机备份还原之后显示服务器問題
- 【深度学习】入门之keras
- bootstrap4 横向表格
- python统计分析pdf下载_Python金融大数据分析PDF高清文档下载
- Unity热更新技术学习——AssetsBundle详解
- 二维矩阵的常见转换技巧
- windows10桌面_Windows 10自带桌面快捷方式管理工具!非常方便值得一试
- 戴森VR体验店:以科技开启未来无限可能 沉浸式购物场景,引领零售新体验