使用GL實(shí)現(xiàn)屏幕畫線

使用GL畫線非常簡(jiǎn)單捶枢,原理就是給定畫線的起始位置听盖。代碼如下:

    public Material _mat;
    private void OnGUI()
    {
        DrawLine(new Vector2(0, 0), new Vector2(Screen.width, Screen.height));
    }

  //屏幕畫線(寬度為1像素锰蓬,無法修改)
    void DrawLine(Vector2 startPos, Vector2 endPos)
    {
        GL.PushMatrix();

        if (!_mat)
        {
            _mat = new Material(Shader.Find("Unlit/Color"));
        }

        _mat.SetPass(0);
        GL.LoadPixelMatrix();//按照像素畫線

        GL.Begin(GL.LINES);
        GL.Vertex(startPos);
        GL.Vertex(endPos);

        GL.End();
        GL.PopMatrix();
    }

效果:


03.PNG

進(jìn)階1:畫有寬度的線捷沸,實(shí)際上是畫矩形塊,需給定矩形的四角的坐標(biāo)值蔓榄,代碼如下:

//進(jìn)階1:屏幕畫有寬度的線(實(shí)際為畫矩形塊)
void DrawLineWidth(Vector2 startPos, Vector2 endPos, float width)
    {
        GL.PushMatrix();

        if (!_mat)
        {
            _mat = new Material(Shader.Find("Unlit/Color"));
        }

        _mat.SetPass(0);

        Vector2 dir = endPos - startPos;
        Vector3 dir_v = Vector3.Cross(Vector3.forward, dir).normalized;

        GL.Begin(GL.QUADS);
        GL.LoadPixelMatrix();

        GL.Vertex(startPos + dir_v * 0.5f*width);
        GL.Vertex(endPos + dir_v * 0.5f*width);
        GL.Vertex(endPos - dir_v * 0.5f*width);
        GL.Vertex(startPos - dir_v * 0.5f*width);       

        GL.End();
        GL.PopMatrix();
    }

效果圖:


01.PNG

使用上面的方式畫出來的線在邊緣處很銳利呵恢、鋸齒感很嚴(yán)重房午,分辨率越低越明顯方淤,可以通過為線條添加一張?jiān)谶吘壧帩u變透明的貼圖改善鋸齒效果侣监。

進(jìn)階2:為線條添加貼圖和顏色
先準(zhǔn)備一張貼圖:


Line.png

寫一個(gè)支持透明貼圖和可修改顏色的shader(該shader只會(huì)使用貼圖的透明通道),如下:

Shader "Unlit/Line"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _MainColor("MainColor",color)=(1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent"}
        LOD 100

        zwrite off
        blend srcalpha oneminussrcalpha

        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;
            fixed4 _MainColor;

            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
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                return fixed4(_MainColor.rgb,col.a);
            }
            ENDCG
        }
    }
}

畫線代碼如下:

//進(jìn)階2:畫有寬度的線并為其賦予顏色和貼圖

void DrawLineWidthTex(Vector2 startPos, Vector2 endPos, float width, Color color)
    {
        GL.PushMatrix();

        if (!_mat)
        {
            _mat = new Material(Shader.Find("Unlit/Line"));
        }

        _mat.SetPass(0);
        _mat.SetColor("_MainColor", color);

        Vector2 dir = endPos - startPos;
        Vector3 dir3 = new Vector3(dir.x, dir.y, 0);
        Vector3 dir_v = Vector3.Cross(Vector3.forward, dir3);
        Vector2 dir_v2 = new Vector2(dir_v.x, dir_v.y).normalized;

        GL.Begin(GL.QUADS);
        GL.LoadPixelMatrix();

        GL.TexCoord(new Vector2(0, 1));//矩形左上角對(duì)應(yīng)的uv坐標(biāo)
        GL.Vertex(startPos + dir_v2 * 0.5f * width);
        GL.TexCoord(new Vector2(1, 1));//矩形右上角對(duì)應(yīng)的uv坐標(biāo)
        GL.Vertex(endPos + dir_v2 * 0.5f * width);
        GL.TexCoord(new Vector2(1, 0));//矩形右下角對(duì)應(yīng)的uv坐標(biāo)
        GL.Vertex(endPos - dir_v2 * 0.5f * width);
        GL.TexCoord(new Vector2(0, 0));//矩形左下角對(duì)應(yīng)的uv坐標(biāo)
        GL.Vertex(startPos - dir_v2 * 0.5f * width);

        GL.End();
        GL.PopMatrix();
    }

效果圖:
02.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臣淤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窃爷,更是在濱河造成了極大的恐慌邑蒋,老刑警劉巖姓蜂,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異医吊,居然都是意外死亡钱慢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門卿堂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來束莫,“玉大人,你說我怎么就攤上這事草描±缆蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵穗慕,是天一觀的道長饿敲。 經(jīng)常有香客問我,道長逛绵,這世上最難降的妖魔是什么怀各? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮术浪,結(jié)果婚禮上瓢对,老公的妹妹穿的比我還像新娘。我一直安慰自己胰苏,他們只是感情好硕蛹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碟联,像睡著了一般妓美。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲤孵,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天壶栋,我揣著相機(jī)與錄音,去河邊找鬼普监。 笑死贵试,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凯正。 我是一名探鬼主播毙玻,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廊散!你這毒婦竟也來了桑滩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤允睹,失蹤者是張志新(化名)和其女友劉穎运准,沒想到半個(gè)月后幌氮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁澳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年该互,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韭畸。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宇智,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胰丁,到底是詐尸還是另有隱情随橘,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布隘马,位于F島的核電站太防,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酸员。R本人自食惡果不足惜蜒车,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幔嗦。 院中可真熱鬧酿愧,春花似錦、人聲如沸邀泉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇恤。三九已至庞钢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間因谎,已是汗流浹背基括。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留财岔,地道東北人风皿。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像匠璧,于是被迫代替她去往敵國和親桐款。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容