Unity开发一个3D模型描边 shader

一、模型描边的原理

模型描边的原理是通过将模型进行轮廓检测,然后在轮廓线上绘制一条边缘线,从而实现模型描边的效果。在 Cocos Creator 中,可使用 shader 实现模型描边。

二、实现模型描边的 shader

在 Unity中,可以通过创建一个新的材质来实现模型描边的效果。首先,在项目资源管理器中创建一个新的 shader,然后在 shader 中添加以下代码:

Shader "Custom/Outline" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _OutlineColor ("Outline Color", Color) = (0,0,0,1)
        _OutlineWidth ("Outline Width", Range(0.0, 0.1)) = 0.01
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 100
        
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };
            
            struct v2f {
                float4 vertex : SV_POSITION;
                float3 normal : NORMAL;
                float4 color : COLOR;
            };
            
            float _OutlineWidth;
            
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.normal = UnityObjectToWorldNormal(v.normal);
                o.color = _Color;
                return o;
            }
            
            fixed4 _OutlineColor;
            
            fixed4 frag (v2f i) : SV_Target {
                fixed4 col = i.color;
                float2 uv = i.vertex.xy / i.vertex.w;
                
                float4 ddx = ddx(i.vertex);
                float4 ddy = ddy(i.vertex);
                float2 edge = float2(_OutlineWidth, _OutlineWidth) * (ddx.yz + ddy.yz);
                float4 outline = tex2D(_CameraDepthTexture, uv);
                outline.a = 1.0;
                outline.rgb = _OutlineColor.rgb;
                outline.a *= step(outline.r, 1.0 - edge.x);
                outline.a *= step(outline.r, edge.y);
                col = lerp(outline, col, col.a);
                return col;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

在代码中,首先定义了三个属性:_Color、_OutlineColor 和 _OutlineWidth。_Color 表示模型的颜色,_OutlineColor 表示描边的颜色,_OutlineWidth 表示描边的宽度。

然后在 Pass 中定义了两个结构体:appdata 和 v2f。appdata 表示输入的顶点数据,v2f 表示输出的顶点数据。在 vert 函数中,将输入的顶点数据转换为输出的顶点数据,并将 _Color 赋值给输出的顶点数据的 color 属性。

在 frag 函数中,首先将输入的顶点数据转换为屏幕坐标系中的坐标,并计算出轮廓线的宽度。然后通过 tex2D 函数获取深度图中的像素值,并将其赋值给 outline 变量。接着,通过 step 函数计算出轮廓线的位置,并将其赋值给 outline 的 alpha 属性。最后,通过 lerp 函数将描边的颜色与模型的颜色进行插值,从而实现模型描边的效果。

三、使用 shader 实现模型描边

在 Cocos Creator 中,可以通过创建一个新的材质来使用 shader 实现模型描边。首先,在项目资源管理器中创建一个新的材质,然后将刚才创建的 shader 赋值给材质的 shader 属性。接着,将模型的材质替换为新创建的材质,即可实现模型描边的效果。

猜你喜欢

转载自blog.csdn.net/qq_21743659/article/details/132022620