首页 > 其他分享 >Unity Shader 风格化水体渲染

Unity Shader 风格化水体渲染

时间:2023-02-11 18:01:12浏览次数:63  
标签:浮沫 颜色 渲染 水体 Shader Unity 风格化 noiseCutOff

风格化渲染(stylized rendering)的具体定义我没能找到,但是在一些文章中,风格化渲染就是指那些非写实的(Non Photorealistic Rendering)渲染。 其中卡通风格的渲染(Toon Shading)是一种典型的风格化渲染。提到风格化渲染,那就绕不过旷野之息。

为此,俺打开了积灰已久的switch,重新看了看这里面的水体渲染是什么样的。 和我印象中不同,旷野之息里面的水体还是比较偏写实的,并没有明显的卡通风格,如下图所示(拍屏党)。

不过还是有些风格化的地方,比如游泳的时候,产生的浮沫是完整的、厚厚的一圈。

之后,俺又去B站找了些做得挺好的风格化水体渲染的效果,例如【JTRP】风格化水体渲染_哔哩哔哩_bilibili

 我们把它和真实感水体渲染比较一下:1. 水体颜色同样基于深度差,但是深水颜色和浅水颜色变化不用很明显,整体颜色相差较小。2. 折射效果相似,但是折射也不是很明显,主要显示水体的基础颜色。3.反射同样不明显,但是在菲涅尔系数较大的时候还是有。4. 浮沫很明显,厚厚的一圈。 5. 高光区域比起真实感的高光也做了调整。

按照这个思路,我们尝试实现一下风格化水体渲染。这篇文章是在之前做的真实感水体渲染的基础上修改的,因此读者可以先看看之前的那篇文章Unity Shader 真实感水体渲染 - Kimi_Raikkonen - 博客园 (cnblogs.com)

1. 水体基础颜色

我们把真实感渲染中的渐变纹理替换成一个浅水区颜色和深水区颜色,并通过一个深度系数depthCoef进行插值。此外用一个指数_AbsorbExp模拟非线性的变化。

half depthCoef = pow(saturate(deltaDepth / _AbsorbCutOff), _AbsorbExp);
fixed3 absorbColor = lerp(_ShallowColor, _DeepColor, depthCoef);

 

2. 折射和反射修改

我们希望折射和反射不要太明显,主要显示水体的基础颜色。

因此在折射和基础颜色进行插值时,更偏向基础颜色。在反射颜色和折射颜色插值时,更偏向于折射颜色(也就更偏向水体基础颜色)。为此,我换了一个菲涅尔系数的计算公式

fresnel = (1 - F0)(1 - n·v)5  

这样,通过调整F0可以使得反射为0,而之前那个公式计算出的反射系数是始终大于0的。

 

3. 浮沫

与真实感水体渲染不同,风格化渲染的浮沫是完整的一圈,有浮沫的区域纯白(或者自定义的浮沫颜色),要么就没有浮沫。

我们仍然用_FoamDistance控制浮沫产生的区域,通过下式计算出一个noiseCutOff,用于等会儿和噪声的采样值比较

half noiseCutOff = _NoiseCutOff * max(deltaDepth / _FoamDistance, 0.2);

这个式子可以多调整调整。水越深让noiseCutOff越大就可以了。这里用了一个max函数是为了让noiseCutOff计算出来不至于为0,不然整个水面都是浮沫了。

之后我们对一张噪声纹理采样(俺这里用的是一张Perlin Noise),得到采样值noise,和noiseCutOff比较,noise > noiseCutOff就产生浮沫。深水区由于noiseCutOff较大,是不会出现浮沫的。

half noise1 = tex2D(_FoamTex, i.uv_foam + _Time.y * half2(_FoamSpeedX, _FoamSpeedY));
half noise2 = tex2D(_FoamTex, i.uv_foam - _Time.y * half2(_FoamSpeedX, _FoamSpeedY));
half noise = 0.5 * (noise1 + noise2);
fixed foam = (noise > noiseCutOff)? 1 : 0;
finalColor += foam * _FoamColor;

 

4. 焦散

和真实感水体渲染一样,加上焦散。可以多试试不同的焦散贴图。

 

 

5. 高光修改

感觉高光也是和真实感渲染区别的重要部分。像上面这张图,高光和水面其它地方有些不在一个画风。

我感觉是,卡通风格的水体上,高光区域里高光的变化不会那么柔和。因此我把Blinn-Phong高光项里面计算出来的较小的高光值给舍弃了,然后让比较大的高光值更偏向1,也就是整个高光区域更偏向纯白色。

是的,smoothstep函数刚好能满足这个要求。

half spec = pow(saturate(dot(worldNormal, halfwayDir)), modGloss);
spec = smoothstep(_SpecCutOff, 1.0, spec); 

这样计算出来高光值比较大的部分都更偏向1,就能起到和风格化水面比较匹配的波光粼粼的效果。

 

References:

【JTRP】风格化水体渲染_哔哩哔哩_bilibili

 Unity Toon Water Shader Tutorial (roystan.net)

标签:浮沫,颜色,渲染,水体,Shader,Unity,风格化,noiseCutOff
From: https://www.cnblogs.com/KimiRaikkonen/p/17109444.html

相关文章

  • MySQLInstallerConsole.exe程序弹出窗口提示“MySQL Installer is running in Communi
    电脑运行中时不时弹出一个窗口,没反应过来就一下自动关闭了,下次再弹出,怎么回事?原来是MySQL的定时更新任务。 解决办法:这个是新版本MySQL服务自带的一个定时任务,每天......
  • Unity Shader 真实感水体渲染
    这两周用UnityShader做了点简单的水体渲染,有真实感的也有非真实感的,打算这几天总结整理一下贴出来。毛星云大牛有一篇详细的真实感水体渲染介绍:https://zhuanlan.zhihu.c......
  • threejs 第二十用 shaderMaterial
    自己写shader就得用这个材质需要vertexfragment先<scriptid="vertex-Shader"type="x-shader/x-vertex">varyingvec2vUv;voidmain(){gl_P......
  • unity乃至的特殊文件夹
    Assets文件夹:游戏资源的顶层文件夹。AssetDatabase方法可以访问里面的任意资源。Editor文件夹:编辑模式下的代码需要放在这里。打包以后,会自动剥离它。EditorDefaultRes......
  • unity2d碰撞和移动的反弹问题
    使用rigidbody2d和collider2d,可以实现控制物体移动和碰撞。但是有一个问题让博主抓狂:代表玩家的小方块撞上障碍物时,会有一瞬间嵌入障碍物,然后被弹回去。简单的控制代码如......
  • Unity操作-脚本使物体移动+旋转
    1.构建物体和对应的脚本 2.完成脚本编辑usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassObjectMoving:MonoBehav......
  • Unity音乐播放
    1.Unity场景搭建  2.脚本编码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassAudioPlay:MonoBehaviour{......
  • Unity之UnityWebRequest和使用
    一、前言1.UnityWebRequest官方描述:UnityWebRequest提供了一个模块化系统,用于构成HTTP请求和处理HTTP响应。UnityWebRequest系统的主要目标是让Unity游戏与Web......
  • VS2019和unity绑定设置
    第一步:打开本机VisualStudioInstaller 第二步:点击修改  第三步:下载对应组件  第四步:修改Unity脚本编辑工具绑定 点击edit -> preferences -> ......
  • Unity学习路线
    【第一阶段】01Unity3D基础操作02C#语言基础03PS图像简单处理04Unity3D界面UI(UGUI或NGUI)05Unity3D动画系统(Mecanim和DOtween)06Unity3D图形数学(点乘、欧......