美文网首页Android开发Android技术知识Android知识
unity中如何用GL函数在屏幕上划线

unity中如何用GL函数在屏幕上划线

作者: 半闲书屋半闲人 | 来源:发表于2016-12-14 10:53 被阅读1346次

一、GL简介

GL是Unity里面的一个底层的图形库,其实是GL立即绘制函数 只用当前material的设置。因此除非你显示指定mat,否则mat可以是任何材质。并且GL可能会改变材质。

GL是立即执行的,如果你在Update()里调用,它们将在相机渲染前执行,相机渲染将会清空屏幕,GL效果将无法看到。通常GL用法是,在camera上贴脚本,并在OnPostRender()里执行。

二、注意事项:

1.GL的线等基本图元并没有uv. 所有是没有贴图纹理影射的,shader里仅仅做的是单色计算或者对之前的影像加以处理。所以GL的图形不怎么美观,如果需要炫丽效果不推荐

2.GL所使用的shader里必须有Cull off指令,否则显示会变成如下

三、使用GL的一般步骤

1、确定材质球和颜色
2、定义线段的点
3、在Update()里确定所要输入的点
4、在OnPostRender()里执行划线命名

四、实现一个例子

画出从鼠标检测到的物体的中心点到鼠标输入的任意一点的线段

贴出代码,将该脚本挂在主摄像机上

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Events;
using UnityEngine.EventSystems;

/// <summary>
/// 实现从带有碰撞器的物体到鼠标移动点之间划线
/// </summary>
public class m_touch : MonoBehaviour {
    public Material mat;                        //材质球
    private GameObject go;                     //鼠标检测到的物体         
    private Vector3 pos1;                      //顶点一
    private Vector3 pos2;                      //顶点二
    private bool isReady = false;               //鼠标点是否有新输入
    private bool isFindGo = false;              //是否找到物体

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                go= hit.collider.gameObject;
                if (go.name == "Cube")
                {
                    //将点击到的物体世界坐标转为屏幕坐标
                    Vector2 screenPos1 = Camera.main.WorldToScreenPoint(go.transform.position);
                    pos1 = new Vector3(screenPos1.x, screenPos1.y, 0);
                    isFindGo = true;
                }
                else if (go.name == "Sphere")
                {
                    Vector2 screenPos1 = Camera.main.WorldToScreenPoint(go.transform.position);
                    pos1 = new Vector3(screenPos1.x, screenPos1.y, 0);
                    isFindGo = true;
                }
            }

        }
        //输入第二个点
        if (Input.GetMouseButton(0) && isFindGo)
        {
            pos2 = Input.mousePosition;
            isReady = true;
        }
    }
    /// <summary>
    /// 划线
    /// </summary>
    void OnPostRender()
    {
        if (isFindGo && isReady)
        {
            GL.PushMatrix();
            mat.SetPass(0);
            GL.LoadOrtho();
            GL.Begin(GL.LINES);
            GL.Color(Color.black);
            Debug.Log(pos1);
            GL.Vertex3(pos1.x / Screen.width, pos1.y / Screen.height, pos1.z);
            GL.Vertex3(pos2.x / Screen.width, pos2.y / Screen.height, pos2.z);
            Debug.Log(pos2);
            GL.End();
            GL.PopMatrix();
        }
    }

}

五、贴出效果图

GL划线.gif

相关文章

网友评论

    本文标题:unity中如何用GL函数在屏幕上划线

    本文链接:https://www.haomeiwen.com/subject/jzkimttx.html