关闭

unity3d 使用GL 方式画线

746人阅读 评论(0) 收藏 举报
分类:
这个是画线部分
复制代码
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();
    }
}
复制代码
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6901797次
    • 积分:82865
    • 等级:
    • 排名:第17名
    • 原创:71篇
    • 转载:4341篇
    • 译文:2篇
    • 评论:857条
    公告
    声明:早期转载的文章未标明转载敬请原谅,以后将陆续改过来,向原创者致敬!

    文章分类