2019-05-17 【Shader】Terrain画线

下面方法实现了,但是有很大的问题。比如说性能的问题。而且用起来和实现,都很不方便。
我今天再次尝试一下projector投影的方式。思路大概是这样,先根据标记点的x,z坐标,以及设置的线宽,
绘制出投影网格或者是投影图片(还不清楚具体流程)。然后开始往下投影。

参考文章(文章例子在2018.4不能正确显示):https://blog.csdn.net/zzlyw/article/details/53992048

image.png

中心思想很简单,就是计算顶点的x,z坐标,是否在直线附近。如果在直线附近,那么就改变它的颜色。
计算是否在线条附近算法,采用了上面参考文章的算法。

Shader "Unlit/lasttest"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _AreaColor("Area Color", Color) = (1, 1, 1)
        _Border("Border", Range(0, 100)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed3 _AreaColor;
            float _Border;

            uniform float4 _Points[5];  // 数组变量
            uniform float _Points_Num;  // 九个区域,每个区域点数 按序连线。
                                        // 例:4,3,3   此时三个区域绘画完毕。第一个区域:_Points[0,1,2,3,0] 第二个区域:_Points[4,5,6,4] 第三个区域:_Points[7,8,9,7]


            //计算两点间的距离的函数
            float Dis(float4 v1, float4 v2)
            {
                return sqrt(pow((v1.x - v2.x), 2) + pow((v1.z - v2.z), 2));
            }

            //绘制线段
            bool DrawLineSegment(float4 p1, float4 p2, float lineWidth, v2f i)
            {
                float4 center = float4((p1.x + p2.x) / 2, 0, (p1.z + p2.z) / 2, 0);
                //计算点到直线的距离  
                float d = abs((p2.z - p1.z)*i.worldPos.x + (p1.x - p2.x)*i.worldPos.z + p2.x*p1.z - p2.z*p1.x) / sqrt(pow(p2.z - p1.z, 2) + pow(p1.x - p2.x, 2));
                //小于或者等于线宽的一半时,属于直线范围  
                float lineLength = sqrt(pow(p1.x - p2.x, 2) + pow(p1.z - p2.z, 2));
                if (d <= lineWidth / 2 && Dis(i.worldPos, center) < lineLength / 2)
                {
                    return true;
                }
                return false;
            }

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);

                if (_Points_Num != 0)
                {
                    //col.xyz = _AreaColor;

                    for (int j = 0; j < _Points_Num; j++)
                    {
                        if (j == (_Points_Num - 1))
                        {
                            if (DrawLineSegment(_Points[j], _Points[0], _Border, i))
                            {
                                col.xyz = _AreaColor;
                            }
                        }
                        else
                        {
                            if (DrawLineSegment(_Points[j], _Points[j +1], _Border, i))
                            {
                                col.xyz = _AreaColor;
                            }
                        }
                    }
                }


                return col;
            }
            ENDCG
        }
    }
}

你可能感兴趣的:(2019-05-17 【Shader】Terrain画线)