使用Unity版本6000.0.72f1,URP包版本17

该图像链接:https://drive.google.com/file/d/1DbuKtRRFbwcuorUZYInWtSWPIlsI6M-p/view?usp=drive_link

图截图链接:https://preview.redd.it/1g2ksqmqvwwg1.png?width=1648&format=png&auto=webp&s=b862d7184482d62378bacc5d70918d0ccbf989e2

我一直在尝试制作这一款隐私窗口着色器,我个人认为效果酷酷的,在实际效果上表现良好,但我总是遇到问题,其中一些前景物体影响着色器的扭曲和模糊。以下是没有添加深度测试前景物体的示意图:

https://preview.redd.it/elsu3neqrwwg1.png?width=518&format=png&auto=webp&s=33fac4625815bb6f120c292e448de0db106415ab

我尝试了可能有4或5种方法来修复这个问题,主要是通过检查扭曲屏幕UVs与原始UVs之间的关系,并取得了一些成果,但不管我如何修改,都总是存在一些细细的像素边缘。以下是最新的实现效果:

仅限玻璃扭曲:

https://preview.redd.it/ulu279zewwwg1.png?width=1163&format=png&auto=webp&s=3dcca496000d382ff9c7032ae94c94cc23ff9681

应用了模糊和扭曲:

https://preview.redd.it/a1uy236iwwwg1.png?width=1085&format=png&auto=webp&s=06b67f55651508fdfcaf7dc37134ee93d77b5a77

如图所示,它消除了前景物体的95%影响。但是,最后的像素会脱离背景视觉效果,影响我的心情。据我所知,我正确应用了深度逻辑,那么这些像素来自哪里呢?

盒子的模糊功能是一个需要显式设置深度可见的HLSL自定义函数(在我所知,应该是的),而无模糊路径只是跳转一个场景颜色节点,以跳过添加模糊,并将扭曲的UV和最终的玻璃颜色输出到发射色素着色器。

以下是盒模糊的代码供大家参考:

ifndef SHADERGRAPH_PREVIEW

include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl"

include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"

float3 sum = float3(0.0, 0.0, 0.0);

float2 offsets[4] = {
float2(-1.0, -1.0),
float2(1.0, -1.0),
float2(-1.0, 1.0),
float2(1.0, 1.0)
};

[unroll]
for(int i = 0; i < 4; i++) {
float2 offsetUV = UV + (offsets[i] * BlurRadius);

    float rawDepth = SAMPLE_TEXTURE2D_X_LOD(_CameraDepthTexture, sampler_CameraDepthTexture, offsetUV, 0).r;
    float sampleDepth = LinearEyeDepth(rawDepth, _ZBufferParams);

    if (sampleDepth < FragmentDepth) {
        offsetUV = UV;
    }

    sum += SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, offsetUV, 0).rgb;
}

Out = sum * 0.25;

else

Out = float3(0.0, 0.0, 0.0);

endif

任何帮助或改进将非常感谢!

如果需要更多的上下文信息或清晰化,请随时告诉我。

如果有谁修复了该着色器并分享了解决方案,100%欢迎自行使用该着色器。只是希望解决问题。

如果有谁能通过此着色器以透明材料渲染,也将非常感谢。目前透明材料会被屏蔽。