利用unity3D Gl圖形庫繪制鼠標軌跡

初心

一開始的時候是想在一張圖上進行涂鴉官硝,經(jīng)過尋找矗蕊,在unity中,可以通過GL圖形庫傻咖,來繪制線條,以達到涂鴉的效果岖研。

代碼實現(xiàn)

簡單的添加了改變線條顏色和線條粗細的功能卿操,在一定程度上可以撤銷操作和斷點繪制
ps:裝13的英文注釋請忽略

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class DrawLineByCursor: MonoBehaviour
{
    //  the line's Material
    private Material m_LineMaterial;
    public Material LineMaterial
    {
        get { return m_LineMaterial; }
    }
    //  MousePosition Data
    private List<List<Vector3>> m_LineInfo;
    //  the line's Width
    public int m_Width = 1;

    public Color LineColor = Color.black;

    //  MouseButtonUp Count
    private int currentID;

    // Use this for initialization
    void Start ()
    {
        currentID = 0;
        //  Create List
        m_LineInfo = new List<List<Vector3>>();
    }
    
    // Update is called once per frame
    void Update ()
    {
        //  the Left mouseButton Up stop recording the mousePosition to this list
        if (Input.GetMouseButtonUp(0))
        {
            currentID += 1;
        }
        // the left mouseButton Down create new mousePosition list
        if (Input.GetMouseButtonDown(0))
        {
            List<Vector3> tmp = new List<Vector3>();
            m_LineInfo.Add(tmp);
        }
        if (Input.GetMouseButton(0))
        {
            m_LineInfo[currentID].Add(Input.mousePosition);
        }

        if (Input.GetKeyDown(KeyCode.C))
            ClearAll();
        if (Input.GetKeyDown(KeyCode.Z))
            Undo();
    }

    //  Draw Line by system
    void OnPostRender()
    {
        //  create the line's shader
        if (m_LineMaterial == null)
            CreateLineShader();
        //  set the Ortho
        GL.LoadOrtho();
        //  filtration the material
        m_LineMaterial.SetPass(0);
        //  strat Draw line
        GL.Begin(GL.LINES);
        //  Get the need draw line Count
        int size = m_LineInfo.Count;
        if (size != 0)
        {
            //  draw line one by one
            for (int i = 0; i < size; ++i)
            {
                for (int j = 0; j < m_LineInfo[i].Count - 1; ++j)
                {
                    Vector3 start = m_LineInfo[i][j];
                    Vector3 end = m_LineInfo[i][j + 1];
                    GL.Color(LineColor);
                    DrawLine(start.x, start.y, start.z, end.x, end.y, end.z, m_Width);
                }
            }
        }
        GL.End();
        
    }

    //  DrawLine procedure
    void DrawLine(float x1, float y1, float z1, float x2, float y2, float z2, int width)
    {
        for (int i = 0; i < width; ++i)
        {
            int iTmp = width / 2;
            // Draw current line
            GL.Vertex3(x1 / Screen.width, y1 / Screen.height, z1);
            GL.Vertex3(x2 / Screen.width, y2 / Screen.height, z2);
            //  Draw Left
            if (i % 2 == 0)
            {
                for (int j = -iTmp; j < iTmp; ++j)
                {
                    GL.Vertex3((x1 - (i / 2)) / Screen.width, (y1 + j) / Screen.height, z1);
                    GL.Vertex3((x2 - (i / 2)) / Screen.width, (y2 + j) / Screen.height, z2);
                }
            }
            //  Draw Right
            else
            {
                for (int j = -iTmp; j < iTmp; ++j)
                {
                    GL.Vertex3((x1 + (i / 2)) / Screen.width, (y1 + j) / Screen.height, z1);
                    GL.Vertex3((x2 + (i / 2)) / Screen.width, (y2 + j) / Screen.height, z2);
                }
            }
        }
    }


    //  Create LineShader
    private  void CreateLineShader()
    {
        Shader shader = Shader.Find("Hidden/Internal-Colored");
        m_LineMaterial = new Material(shader);
        m_LineMaterial.hideFlags = HideFlags.HideAndDontSave;

        m_LineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
        m_LineMaterial.SetInt("_DstBlend",(int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);

        m_LineMaterial.SetInt("_Cull",(int)UnityEngine.Rendering.CullMode.Off);

        m_LineMaterial.SetInt("_ZWrite", 0);
    }

    // ClearAll
    public void ClearAll()
    {
        m_LineInfo.Clear();
        currentID = 0;
    }

    // Undo
    public void Undo()
    {
        if (currentID > 0)
            currentID--;
        m_LineInfo.RemoveAt(currentID);
    }
}

附注
在使用過程中,嘗試使用unity創(chuàng)建完成的材質(zhì)球孙援,發(fā)現(xiàn)無法改變線條的顏色害淤,所以動態(tài)創(chuàng)建了材質(zhì),如果有大神知道如何使用通過unity創(chuàng)建的材質(zhì)球拓售,煩請指點

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窥摄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子础淤,更是在濱河造成了極大的恐慌崭放,老刑警劉巖哨苛,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莹菱,居然都是意外死亡移国,警方通過查閱死者的電腦和手機吱瘩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門道伟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人使碾,你說我怎么就攤上這事蜜徽。” “怎么了票摇?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵拘鞋,是天一觀的道長。 經(jīng)常有香客問我矢门,道長盆色,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任祟剔,我火速辦了婚禮隔躲,結果婚禮上,老公的妹妹穿的比我還像新娘物延。我一直安慰自己宣旱,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布叛薯。 她就那樣靜靜地躺著浑吟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耗溜。 梳的紋絲不亂的頭發(fā)上组力,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音抖拴,去河邊找鬼燎字。 笑死,一個胖子當著我的面吹牛城舞,可吹牛的內(nèi)容都是我干的轩触。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼家夺,長吁一口氣:“原來是場噩夢啊……” “哼脱柱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拉馋,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榨为,失蹤者是張志新(化名)和其女友劉穎惨好,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體随闺,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡日川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矩乐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄句。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖散罕,靈堂內(nèi)的尸體忽然破棺而出分歇,到底是詐尸還是另有隱情,我是刑警寧澤欧漱,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布职抡,位于F島的核電站,受9級特大地震影響误甚,放射性物質(zhì)發(fā)生泄漏缚甩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一窑邦、第九天 我趴在偏房一處隱蔽的房頂上張望擅威。 院中可真熱鬧,春花似錦奕翔、人聲如沸裕寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾袜。三九已至,卻和暖如春驾窟,著一層夾襖步出監(jiān)牢的瞬間庆猫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工绅络, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留月培,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓恩急,卻偏偏與公主長得像杉畜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衷恭,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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