• 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
  • 相关阅读:
    Appuim学习路-Appuim介绍
    mac下将根目录/更改组到普通用户,导致sudo不能用
    shell获取函数的返回值
    grep匹配字符串出现的次数
    python实现测试报告的bug统计
    ios开发者账号、证书相关内容
    java基础三 [深入多态,接口和多态](阅读Head First Java记录)
    java基础二(阅读Head First Java记录)
    mac下搭建appium
    窗口管理器 Openbox 入门指南
  • 原文地址:https://www.cnblogs.com/dragon2012/p/4054760.html
Copyright © 2020-2023  润新知