【unity shader】毛绒材质效果的实现

今天主要说的主题是如下图所示的几种毛绒材质的效果实现。



仔细看你就会发现3张图中的实现效果各不相同。一是和用的噪波图不同有关系,第二个就是实现方式有些不一样,里面实际上用了两种实现方式。


    先说第一种简单的实现方式,主体思路是先用曲面细分,然后再将顶点按照法线方向和噪波图凸起。(这里说下曲面细分是不可以在手机平台使用的)。因为这种方法实现起来特别简单,我就直接用sf的连图做解释,不把敲的源码丢上来了。


这里需要注意的有3个地方。

第一个  就是必须要启用曲面细分,不然顶点数肯定是不够的。我在自己项目里是调用unity自带的曲面细分,并不知道SF怎么写的,所以不进行细讲曲面细分怎么写。

第二  就是我把噪波图作为AO图计算到了漫反射里面增加世界上的凹凸效果。

第三  就是vertex+=normalDir*噪波图.r*_power这个凸起计算了。可以看连图中VertexOff那个口的连线。

这种方法的优点是没有用混合模式,各种计算不容易出错,大家肯定都知道透明是一个大坑,能少碰少碰。

然后实际效果就是这样的,和我上面的展示图肯定有差距,大家自己进行优化,我也是敲了很久的。


=================================分割一下=================================

        说完第一种低消耗效果还过的去的方法下面我们来说说第二种效果比较好但是处理起来消耗居高还很麻烦的方法。不过为了效果啥都可以忍。看下图,我想大部分人就可以知道大部分实现方法了。


这个效果是在一中的效果发现进一步过来的。你们应该都看出来了,这时候开启了混合计算。

首先这里继承上面一中的123点,不再重写了。

不过这里需要关闭深度,开启混合

        ZWrite On
        Cull Off
        Blend SrcAlpha OneMinusSrcAlpha // Alpha blending

然后要说的是这里采用的方法是用了50个pass逐层外扩,然后逐层缩小范围。这里上段其中一个pass的源码。


 Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
 
            Blend [_SrcBlend] [_DstBlend]

             CGPROGRAM
            #pragma target 5.0
            #pragma exclude_renderers gles
            #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
            #pragma shader_feature _EMISSION
            #pragma shader_feature _METALLICGLOSSMAP
            #pragma shader_feature ___ _DETAIL_MULX2
            #pragma shader_feature _PARALLAXMAP
         
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #define MARZAFURBASEPASS
            #define FUR_OFFSET 0.010000//就是这里控制变化,有50个这样的pass,当然还有50个这样的forwardadd的pass
            #include "MFFZ.cginc"
            ENDCG
        }
这样原理就说完了,应该大家都看懂了,不懂的地方留言吧。实在不行就用方法一,方法二我搞实时渲染才用的。

猜你喜欢

转载自blog.csdn.net/u011369981/article/details/80081138