6.顶点描边

原理:两个pass,第一个pass 将物体顶点放大一点,然后固定颜色渲染出来
第二个pass,按照原大小进行对应的渲染。相同像素点,第二个pass会覆盖第一个的颜色点

注意的地方:xyz的缩放,是不是缩放两个轴?


image.png
float4 tempvec = float4(v.vertex.x*1.1, v.vertex.y*1.1, v.vertex.z*0.8, v.vertex.w);

如果是xyz均进行缩放,那么需要第二个pass 里面添加代码,让永远显示第二个pass的颜色值
效果如下


image.png
Shader "Unlit/OutLine"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags{ "RenderType" = "Opaque" "RenderType"="Transparent"}
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                //如果xyz 均进行 放大,那么会生成一个大 一圈的全方面的立方体,会将原先的立方体,包含在内。
                float4 tempvec = float4(v.vertex.x*1.1, v.vertex.y*1.1, v.vertex.z*1.1, v.vertex.w);
                o.vertex = UnityObjectToClipPos(tempvec);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(1,0,0,1);
            }
            ENDCG
        }

        Pass
            {
                ZWrite on
                //显示该颜色
                ZTest Always

                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                
                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };

                struct v2f
                {
                    float2 uv : TEXCOORD0;
                    float4 vertex : SV_POSITION;
                };
                sampler2D _MainTex;
                float4 _MainTex_ST;

                v2f vert(appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    return fixed4(0,0,0,1);
                }
                ENDCG
            }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容