美文网首页
轻量管线下一个ComputeScreenPos的bug

轻量管线下一个ComputeScreenPos的bug

作者: 恶毒的狗 | 来源:发表于2019-11-08 11:23 被阅读0次

一个差评

闲来无事的时候,我也会发布一些插件到unity商店售卖,上个月的收入有500多美金,还行。

我发现大部分买插件的人都不评论的,买完即走,不留痕迹。当然有真心点赞的,也有一言不合就差评的。

有些差评确实反应了真实的代码问题,比如下面的这个差评,源自哥的一个水的插件:LWRP SSR Water

差评.png

这位大哥说,我的水在VR下有奇怪的反射效果,我试了一下,果真如此:

错误效果.png

正确的效果应该是这样的:

正确效果.png

好吧,我本身不是做VR开发的,确实没为VR做考虑,不过顾客是上帝,我还是尝试去修复一下。


Bug分析

我的这个水基于前向渲染,利用屏幕空间反射带替代Unity提供的环境反射。在VR下,显示了错误的效果,看上去是没处理左右眼的问题。

奇怪的是,这个问题在标准管线下不存在,只存在于轻量管线。通过仔细的代码对比,我发现问题如下:

屏幕空间反射,顾名思义,我需要把世界坐标转换到屏幕坐标。计算屏幕坐标的时候,我用了Unity内置的ComputeScreenPos,但是标准版和LWRP版的ComputeScreenPos的代码略有差别:

标准版:

inline float4 ComputeScreenPos(float4 pos) {
    float4 o = ComputeNonStereoScreenPos(pos);
#if defined(UNITY_SINGLE_PASS_STEREO)
    o.xy = TransformStereoScreenSpaceTex(o.xy, pos.w);
#endif
    return o;
}

lightweight@6.9.0

// TODO: A similar function should be already available in SRP lib on master. Use that instead
float4 ComputeScreenPos(float4 positionCS)
{
    float4 o = positionCS * 0.5f;
    o.xy = float2(o.x, o.y * _ProjectionParams.x) + o.w;
    o.zw = positionCS.zw;
    return o;
}

原来lightweight版本并没有对UNITY_SINGLE_PASS_STEREO做处理。


修正

知道原因,修复就很容易了。

我封装了一个把世界坐标转换成屏幕坐标的函数,在函数最后加上对UNITY_SINGLE_PASS_STEREO的处理即可。

    void SSRRayConvert(float3 worldPos, out float4 clipPos, out float3 screenPos)
    {
        clipPos = TransformWorldToHClip(worldPos);
        float k = ((1.0) / (clipPos.w));

        screenPos.xy = ComputeScreenPos(clipPos).xy * k;
        screenPos.z = k;

        #if defined(UNITY_SINGLE_PASS_STEREO)
            screenPos.xy = UnityStereoTransformScreenSpaceTex(screenPos.xy);
        #endif
    }

再来一张

要不要转换做VR.png

舒服。

相关文章

  • 轻量管线下一个ComputeScreenPos的bug

    一个差评 闲来无事的时候,我也会发布一些插件到unity商店售卖,上个月的收入有500多美金,还行。 我发现大部分...

  • 如何用轻量协作工具做bug管理

    对于一个团队来说,工作效率的高低很大程度上取决于团队的管理。 而作为一名刚接触测试职位的新人来说,如何把一堆堆杂乱...

  • 关于ComputeScreenPos和ComputeGrabSc

    一个Bug 今天QA报了一个渲染相关的bug:一个用了 扭曲 效果的翅膀特效在场景相机下显示正常,但是在UI相机上...

  • 轻量漫游

    1、 “不懂你就多向别人学习啊,借鉴其他APP好的地方,发散思维……”老板balabala一通训斥。 程序猿小王沮...

  • TVTK管线与数据加载

    TVTk的管线 管线技术(Pipeline,流水线) 可视化管线(Visualization Pipeline):...

  • 固定渲染管线与可编程渲染管线

    1.固定渲染管线与可编程渲染管线的区别: 1)、固定渲染管线 ——这是标准的几何&光照(T&L)管线,功能是固定的...

  • 使用python归类android异常文件

    上周入职新公司,公司的业务有做sdk。遇到反馈的bug量直线上升,每天bug量达到了上千个。我得到的第一个任务是对...

  • goroutine轻量的秘密

    在讨论Go编程语言时,经常被提起的一个特点是使用goroutines;这是一种轻量级进程,可以并发运行成千上万的g...

  • 第158天  第一版bug修改完毕

    汉语说,第一版的bug修改完了,准备弄下一个版本。

  • 五款轻量型bug管理工具横向测评

    最近正在使用的本地bug管理软件又出问题了,已经记不清这是第几次了,每次出现问题都要耗费大量的时间精力去网上寻找解...

网友评论

      本文标题:轻量管线下一个ComputeScreenPos的bug

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