资源大湿 发表于 2021-5-11 09:03

Unity-两个简单的油画渲染方法

本文主要介绍两个简单的油画渲染方式,不会涉及代码,只讲基本思想和结构~
后处理方式渲染油画

首先是一种传统的后处理渲染的方式,算法基本来自论文(Oil Painting Style Rendering Based on Kuwahara Filter),论文流程图如下。
而我基本是按照论文的步骤来的。用Kuwahara Filter(之前水彩画文章也提过,参考知乎呆晒晒的UE4卡通渲染基础教程 Part4:Paint Filter)代替Saliency Map;然后算出ETF图(参考知乎alpacasKing的在Unity中实现基于GPU的线积分卷积(LIC)),将此图当作Paper混合到图上;最后把轮廓线检测当作法线贴图。非常简单~OVER~
最后的效果如下:
http://pic2.zhimg.com/v2-114903a84b722bbc5b5c40703ba048d_r.jpg笔触方式

另外一个方式则是基于unity asset的一个油画插件,这个方法最终的效果是为了模拟每一笔油画笔触的效果,先上最终效果图吧~
其中最主要的思想是,首先自建一个mesh数据,该mesh数据的顶点是6的倍数。这样设置的目的是在后处理的顶点着色器里把每6个顶点扩展成一个quad,然后就可以用预先设置的笔触贴图渲染这些quad了。简单的说,该mesh数据有6*100个顶点,最后就可以生成100给quad。
最后将这些笔触quad平铺到整个屏幕上,在映射相应的屏幕的颜色值即可。是一个用顶点着色器代替几何着色器的妙招~
上图是仅仅显示quad的图像了。不过这里还进行了一个步骤,首先,把原始的所有笔触quad分层平铺到屏幕射;然后通过颜色的偏移值(ddx、ddy)来控制笔触的大小和显示,也就是说让颜色密度大的地方用大的笔触,反之亦然。
其中每个笔触还有其光照渲染(其实也就是简答的法线光照),旋转(可以根据ETF图来定方向)等等,就不赘述了。
根据此方式稍微的改进
以上就是原始asset的基本思想。但是这样的方式有个弊端,就是画面抖动会非常剧烈。因此考虑直接在模型上用这种方式,算是一种改进吧。思想也非常简单,就是根据模型生成单独的mesh数据。先写个小插件,在原始模型上均匀采样点,此采样点则是生成mesh的顶点,记住要重复6次哟;然后每个顶点根据其密度赋值一定的顶点色,用于后期控制笔触的大小。最后再与背景的笔触合并,即可。如下图,可看到右边是根据自己生成的mesh重新覆盖了一层笔触渲染,这样笔触可以根据模型旋转而旋转。最终效果图也能看到,右边的模型旋转时候的闪烁效果好了许多~
页: [1]
查看完整版本: Unity-两个简单的油画渲染方法