美文网首页Unity商店资源推广
更精确SSR的交点检测

更精确SSR的交点检测

作者: 恶毒的狗 | 来源:发表于2020-03-07 00:55 被阅读0次

Unreal的SSR交点检测

关于 屏幕空间反射,可以参考文章很多,我觉得这篇写得还是蛮好的:Screen Space Glossy Reflections,借个图用用:

image

本文不考虑 粗糙度,也不考虑 多条反射射线,只借鉴一下 Unreal 引擎在处理 单条射线光线步进 时对 交点 的计算方式,用来改进我的插件 LWRP/URP SSR Water 的反射表现。

直接看下面这段最简单的 光线步进 代码片段:

#if SCALAR_BRANCHLESS    

    float MinHitTime = 1;
    float LastDiff = 0;

    float SampleTime = StepOffset * Step + Step; 

    UNROLL
    for( int i = 0; i < NumSteps; i++ )
    {
        float3 SampleUVz = RayStartUVz + RayStepUVz * SampleTime;
        
        // Use lower res for farther samples
        float 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 并不着急返回 当前射线终点 对应的 屏幕坐标,而是根据上一段射线终点和当前射线终点相对于场景深度的偏移 插值 出一个更加准确的 屏幕坐标

有点绕口,画个图就明了了:

image

上图显示的是射线深度刚超过场景深度时的情形,图中 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 时,之前的表现就一般般了,如下图:

image

添加插值后,还是 1200 x 600 的分辨率,表现就好多了:

image

如果把分辨率提到 2160 x 1080 这种常见的手机分辨率,表现就更好了:

image

做为一个水的shader,这样就差不多了,因为加上水波纹后,一切都是浮云:

image

个人主页

本文的个人主页链接:https://baddogzz.github.io/2020/03/06/Accurate-Hit/

好了,拜拜!

相关文章

  • 更精确SSR的交点检测

    Unreal的SSR交点检测 关于 屏幕空间反射,可以参考文章很多,我觉得这篇写得还是蛮好的:Screen Spa...

  • SSR协议检测技术

    既然SSR的项目已经消亡,那么现在对于SSR的检测手段也没有什么保留意义了,那么就把个人对DPI进行SSR检测技术...

  • SSR 中性检测 PopGene

    Xiao Y, Cai D, Yang W, et al (2012) Genetic structure and...

  • Jest 测试框架 expect 和 匹配器 matcher 的

    副标题:SAP Spartacus SSR 优化的单元测试分析之二 - 调用参数检测源代码: 注意观察 jest....

  • 检测数据类型

    1、typeof 只能检测基本数据类型 2、instanceof 检测并不精确,一个数组 instanceof A...

  • Linux 配置代理

    软件要求 SSR Proxychains4 准备工作 SSR 获取ssr脚本 赋予ssr脚本可执行权限 将ssr放...

  • 南北交点及星座的具体意义

    转“北交点是什么 星座里的南交点与北交点的具体意义是什么 北交点南交点的星座与宫位 北交点与南交点是月亮轨道与黄道...

  • 臭氧检测仪的使用方法-逸云天

    众所周知,通过使用臭氧检测仪来检测空气中臭氧的含量以及臭氧的浓度大小,主要可用于需要移动式快速精确检测和读取现场的...

  • VUE SSR

    VUE SSR 官方文档: Vue SSR 指南 一、什么是SSR, 为什么要做SSR 什么是SSRVue.js ...

  • SSR

    SSR检测 也称简单重复序列,是广泛分布在真核生物基因组中的简单重复序列。 微卫星标记(microsatellit...

网友评论

    本文标题:更精确SSR的交点检测

    本文链接:https://www.haomeiwen.com/subject/flstdhtx.html