unity3d 使用GL 方式画线

这个是画线部分
private Vector3[] linePoints;
    public int m_LineCount;
    public int m_PointUsed;



 public void RenderPath()
    {
        
        GL.Begin(GL.LINES);

        for (int i = 0; i < m_LineCount - 1; ++i)
        {

            GL.Vertex(GetPoint(i));

            GL.Vertex(GetPoint(i + 1));

        }

        GL.End();
    }

但是这个画线部分要放到   void OnPostRender() 这个函数里面去

void OnPostRender()
    {
       
        GL.Color(Color.red);
        GL.PushMatrix();
        mat.SetPass(0);
        m_linePath[0].RenderPath();
        m_linePath[1].RenderPath();
        m_linePath[2].RenderPath();

        GL.PopMatrix();
    }

而void OnPostRender() 这个函数的类的脚本需要绑定到摄像机上面才能显示线条,绑定其他物体是不行的

class MiCirle
{ 
    private  Vector3[] linePoints;
    private int m_PointCount = 0;
    private Vector3 m_EarthPos;

    public void Init(Vector3 _Pos,float _s)
    {
        m_EarthPos = _Pos;
        linePoints = new Vector3[390];

        CompliteAllPoint(_s);
    
    }

    float DegreetoRadians(float x)
    {
        return x * 0.017453292519943295769f;
    }

    float RadianstoDegrees(float x)
    {
        return x * 57.295779513082321f;
    }



    void AddPoint(Vector3 _vec)
    {
        linePoints[m_PointCount++] = _vec;


    }
    Vector3 GetPoint(int _x)
    {
        if (_x > 360)
            return new Vector3(0, 0, 0);
        else
            return linePoints[_x];

    }

    void CompliteAllPoint(float _size)
    {
        float angle = 0;
        float SizeX = _size;
       
        for (int i = 0; i < 361; i++)
        {
            float XPos = Mathf.Sin(DegreetoRadians(i)) * SizeX;
            float YPos = Mathf.Cos(DegreetoRadians(i)) * SizeX;

          


            Vector3 temp = new Vector3(m_EarthPos.x + XPos, m_EarthPos.y + YPos, m_EarthPos.z);
           


            AddPoint(temp);

        }

    }

    public void RenderLines()
    {
        GL.Begin(GL.LINES);

        for (int i = 0; i < 360; ++i)
        {
            GL.Color(Color.white);
            GL.Vertex(GetPoint(i));

            GL.Vertex(GetPoint(i + 1));
        }

        GL.End();

    }

    public void RenderVirtualLine()
    { 
        
    
    }


};

调用则:

public class MainScript : MonoBehaviour
{
    public GameObject m_ObjEarth;
    public GameObject m_ObjMoon;

  
    private int m_LineCount =0;
    private MiCirle m_CircleNomal;
    private MiCirle m_CircleBig;
    private MiCirle m_CircleSmall;


    private Vector3 m_EarthPos;
    private Material lineMaterial;

  
    void Start ()
    {
        

        m_EarthPos = m_ObjEarth.transform.position;
        m_CircleNomal = new MiCirle();
        m_CircleBig = new MiCirle();
        m_CircleSmall = new MiCirle();


        m_CircleNomal.Init(m_EarthPos,3.5f);
        m_CircleBig.Init(m_EarthPos,4.0f);
        m_CircleSmall.Init(m_EarthPos,3.0f);

        lineMaterial = new Material("Shader "Lines/Colored Blended" {" +
                "SubShader { Pass {" +
            "   BindChannels { Bind "Color",color }" +
            "   Blend SrcAlpha OneMinusSrcAlpha" +
            "   ZWrite Off Cull Off Fog { Mode Off }" +
            "} } }");

        lineMaterial.hideFlags = HideFlags.HideAndDontSave;

        lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;

        
    }
    
    // Update is called once per frame
    void Update () 
    {
    
    }

  

    void OnPostRender()
    {
        lineMaterial.SetPass(0);

      //  Debug.Log("Render lines");

        GL.Color(Color.red);
        GL.PushMatrix();
        m_CircleNomal.RenderLines();
        m_CircleBig.RenderLines();
        m_CircleSmall.RenderLines();


        GL.PopMatrix();
    }
}
View Code
原文地址:https://www.cnblogs.com/dragon2012/p/4054760.html