一、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();
}
}
}
五、贴出效果图