【unity shader/风格化水表面渲染/基础笔记】urp代码版06-简单湿岸模拟

前言


前5章完成了岸边泡沫、水表面上色、波浪、焦散等功能。本章新建一个pass来模拟简单的湿岸效果,也就是退潮时,岸的潮湿现象
在这里插入图片描述

  • 涉及的知识点
    -Depth Fade

新建pass


这个pass同样使用GerstnerWave函数来改变顶点,但波长需要平移。
然后获取抓屏_CameraOpaqueTexture贴图,并调色,效果如下
在这里插入图片描述
然后会发现衔接处会非常生硬,本章主要对这个做出改进
可以使用第一章所得出的RawDepth来处理,本章则使用**Depth Fade**来生成下图的Mask,**请注意DepthFade一般在深度写入关闭的Transparent模式起作用,因为非透明物体会遮挡,从而无法计算被物体遮挡下的顶点数据。**由于水面就是半透明的mesh,所以可以用这个方法
在这里插入图片描述

获得观察空间的深度差

在我们采样原来的_CameraDepthTexture后,使用**LinearEyeDepth**函数,其实就是通过深度反推出视图空间下z

                float4 screenPos = i.scrPos / i.scrPos.w;
                float sceneRawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, sampler_CameraDepthTexture,screenPos.xy);
                sceneRawDepth =  LinearEyeDepth(sceneRawDepth, _ZBufferParams);

被遮挡的顶点z与当前mesh的z相减,然后做以下处理

                float distanceDepth = abs((sceneRawDepth - LinearEyeDepth(screenPos.z , _ZBufferParams)) / ((_FadeDistance * 0.01 )));
                distanceDepth = max((1.0 - distanceDepth), 0.0001);
                float DepthInteraction =  smoothstep(0, _InterSoftness, saturate(pow(distanceDepth, (_FadeSoftness * 0.1))));
                DepthInteraction = 1- saturate( DepthInteraction);

应用深度差

然后,我们将DepthInteraction应用于alpha,会得到如下效果

            real4 frag(v2f i) : SV_TARGET
            {
                float4 screenPos = i.scrPos / i.scrPos.w;
                float sceneRawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, sampler_CameraDepthTexture,screenPos.xy);
                sceneRawDepth =  LinearEyeDepth(sceneRawDepth, _ZBufferParams);

                float distanceDepth = abs((sceneRawDepth - LinearEyeDepth(screenPos.z , _ZBufferParams)) / ((_FadeDistance * 0.01)));
                distanceDepth = max((1.0 - distanceDepth), 0.0001);
                float DepthInteraction =  smoothstep(0, _InterSoftness, saturate( pow(distanceDepth , (_FadeSoftness * 0.1 ))));
                DepthInteraction = 1- saturate( DepthInteraction);
                real4 grab_col = SAMPLE_TEXTURE2D(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, screenPos.xy) * _Wetness;
                float alpha = lerp(0, 1, DepthInteraction);
                return real4( grab_col.xyz, alpha);
            }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值