永远相信美好的事情即将发生 😊!

Toon Water实现(URP)

分享 Mavis 4℃ 0评论

本篇内容是在https://roystan.net/articles/toon-water.html 教程的指导下完成的,大家可以去看原教程

首先来看一下效果图:

然后来一步一步实现它

首先先了解一下这个场景,地面是有一个坑的

坑上放了一个平面,该平面的材质为我们即将制作的Toon water,水中还放置了一个救生圈,实现起来其实也不难,教程里也很详细,只不过urp写法有一丢丢不一样,下面就直接给关键代码吧,分析太多了也没有原教程分析的好,就不献丑了,相关注释在代码中都写的非常详细了。

// 根据深度插值水的颜色。                
float sceneZ = LinearEyeDepth(SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, i.projPos.xy / i.projPos.w), _ZBufferParams);//地面的深度
float depthDifference =sceneZ-i.projPos.w;//地面和水面的深度差值(地面肯定更深,所以放前面)
float waterDepthDifference01 = saturate(depthDifference / _DepthMaxDistance);//在将深度差控制在最大深度差范围内并返回比例
float4 waterColor = lerp(_DepthGradientShallow, _DepthGradientDeep, waterDepthDifference01);//根据上面计算出来的插值水深水浅的颜色得到最终的水面颜色
// 通过噪声纹理获取表面的波浪
float2 distortSample = (SAMPLE_TEXTURE2D(_SurfaceDistortion,sampler_SurfaceDistortion, i.distortUV).xy) * _SurfaceDistortionAmount;//得到对噪声图uv进行扰动的值,并且用一个值来控制扰动的强度
float2 noiseUV = i.noiseUV + distortSample + _Time.y * _SurfaceNoiseScroll;//根据原噪声图uv加上扰动值,再加上一个用时间控制的偏移量,让uv动起来
float surfaceNoiseSample = SAMPLE_TEXTURE2D(_SurfaceNoise,sampler_SurfaceNoise, noiseUV).r;//根据重新计算的uv采样得到噪声值
//比较空间法线
float3 floorNormal =normalize(DecodeNormal(SAMPLE_TEXTURE2D(_CameraDepthNormalsTexture, sampler_CameraDepthNormalsTexture, i.projPos.xy / i.projPos.w)));//获取地面的法线(目前我使用的urp版本深度法线贴图得自己用renderfeature渲染)
float3 waterNormal = normalize(i.viewNormal);//水面的法线值
float3 normalDot = saturate(dot(floorNormal, waterNormal));//两个法线值的夹角cos值,并舍弃夹角大于九十度的情况
// 通过调整阈值来控制漂浮泡沫数量         
float foamDistance = lerp(_FoamMaxDistance, _FoamMinDistance, normalDot);//normalDot会随着离岸边越来越远而变大(物体周边该值也是从最小值开始变大的)
//靠近岸边和物体的时候,foamDistance的值更靠近_FoamMaxDistance,由于该区域的depthdifference比较小,所以得到的foamDepthDifference01会靠近0
//远离岸边和物体的时候,foamDistance的值更靠近_FoamMinDistance,由于该区域的depthdifference比较大,所以得到的foamDepthDifference01会靠近1
float foamDepthDifference01 = saturate(depthDifference / foamDistance);//岸边和物体边的depthdifference小,所以当foamDistance越大的时候,得到的foamDepthDifference01越小
float surfaceNoiseCutoff = foamDepthDifference01 * _SurfaceNoiseCutoff;//因为岸边和物体边的foamDepthDifference01要靠近0,所以用这个值调整原来的阈值,阈值越小,留下的泡沫越多
//抗锯齿
float surfaceNoise = smoothstep(surfaceNoiseCutoff - SMOOTHSTEP_AA, surfaceNoiseCutoff + SMOOTHSTEP_AA, surfaceNoiseSample);//通过smoothstep平滑噪声值边界
float4 surfaceNoiseColor = _FoamColor;//泡沫的颜色
surfaceNoiseColor.a *= surfaceNoise;//泡沫的可见程度根据噪声值来调整
return alphaBlend(surfaceNoiseColor, waterColor);//根据alpha值混合表面泡沫和水面的颜色。

 

 

 

 

 


Mavis , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Toon Water实现(URP)
喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址