1、绘制2D图像的时需要使用GL.LoadOrtho()方法来将图形映射到平面中。

  2、所有绘制相关的内容都要写在OnPostRender()方法中。

  3、有关GL图像库的脚本需要绑定到Hierarchy视图中Camera上,否则无法显示绘制的图像。

  4、在GL图像库的平面坐标系中,每个点的横坐标和纵坐标都应当是0与1之间的浮点数,而真实的像素坐标需要根据这个浮点数来计算

一、绘制线

  别忘了添加物理材质public Material material;

using UnityEngine;
using System.Collections; /// <summary>
/// GL 图像库
/// 1、GL图像库是底层的图像库,主要功能是使用程序来绘制常见的2D与3D几何图形。这些图形
/// 具有一定的特殊性,它们不属于3D网格图形,只会以面的形式渲染
///
/// 2、绘制2D图像时,需要使用GL.LoadOrtho()方法来将图形映射在平面中,绘制的是3D图形,就无须使用此方法
///
/// 3、使用GL图像库时,需要将所有绘制相关的内容写在OnPostRender()方法中
/// </summary>
public class _7_5 : MonoBehaviour
{
/// <summary>
/// 绘制线段的材质
/// </summary>
public Material material; private void OnPostRender()
{
if (!material)
{
Debug.Log("请给材质资源赋值");
return;
}
material.SetPass();//设置该材质通道,0为默认值
GL.LoadOrtho();//设置绘制2D图像
GL.Begin(GL.LINES);//表示开始绘制,绘制类型为线段
DrawLine(, , , );//绘制线段0
DrawLine(, , , );//绘制线段1
DrawLine(, , , );//绘制线段2
GL.End();//结束绘制
} private void DrawLine(float x1, float y1, float x2, float y2)
{
//绘制线段,需要将屏幕中某个点的像素坐标除以屏幕宽或高
GL.Vertex(new Vector3(x1 / Screen.width, y1 / Screen.height, ));// ['vɜ:teks] n. 最高点;顶点;<数>(三角形、圆锥体等与底相对的)顶;
GL.Vertex(new Vector3(x2 / Screen.width, y2 / Screen.height, ));
} // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

二、绘制曲线

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 绘制曲线
/// </summary>
public class _7_5_1 : MonoBehaviour
{
/// <summary>
/// 绘制线段材质
/// </summary>
public Material material; private List<Vector3> lineInfo;
// Use this for initialization
void Start()
{
//初始化鼠标线段链表
lineInfo = new List<Vector3>();
} // Update is called once per frame
void Update()
{
//将每次鼠标改变的位置存储进链表
lineInfo.Add(Input.mousePosition);
} private void OnGUI()
{
GUILayout.Label("当前鼠标x轴位置" + Input.mousePosition.x);
GUILayout.Label("当前鼠标y轴位置" + Input.mousePosition.y);
} private void OnPostRender()
{
if (!material)
{
Debug.LogError("请给材质资源赋值");
return;
}
material.SetPass();//设置该材质通道,0为默认值
GL.LoadOrtho();//设置绘制2D图像
GL.Begin(GL.LINES);//表示开始绘制,绘制类型为线段
for (int i = ; i < lineInfo.Count - ; i++)
{
Vector3 start = lineInfo[i];
Vector3 end = lineInfo[i + ];
//绘制线段
DrawLine(start.x, start.y, end.x, end.y);
}
GL.End();
}
/// <summary>
/// 绘制线段
/// </summary>
/// <param name="x1"></param>
/// <param name="y1"></param>
/// <param name="x2"></param>
/// <param name="y2"></param>
private void DrawLine(float x1, float y1, float x2, float y2)
{
//绘制线段,需要将屏幕中某个点的像素坐标点除以屏幕宽或高
GL.Vertex(new Vector3(x1 / Screen.width, y1 / Screen.height, ));// [ˈvɜ:ˌteks] 最高点;顶点
GL.Vertex(new Vector3(x2 / Screen.width, y2 / Screen.height, ));
}
}

三、绘制四边形

  绘制四边形,需要使用GL.Begin(GL.QUADS)方法

using UnityEngine;
using System.Collections; public class _7_5_3 : MonoBehaviour
{
/// <summary>
/// 可用材质0
/// </summary>
public Material material0;
/// <summary>
/// 可用材质1
/// </summary>
public Material material1;
/// <summary>
/// 可用材质2
/// </summary>
public Material material2; private void OnPostRender()
{
//绘制正四边形
DrawRect(, , , , material0);
DrawRect(, , , , material1);
//绘制无规则四边形
DrawQuads(, , , , , , , , material2);
} /// <summary>
/// 绘制正四边形
/// </summary>
/// <param name="x">x轴起始坐标</param>
/// <param name="y">y轴起始坐标</param>
/// <param name="width">正四边形的宽</param>
/// <param name="height">正四边形的高</param>
/// <param name="material"></param>
private void DrawRect(float x, float y, float width, float height, Material material)
{
GL.PushMatrix(); // [ˈmeɪtrɪks]n. <数>矩阵;模型;基质;母体,子宫
material.SetPass();
GL.LoadOrtho();
GL.Begin(GL.QUADS);//绘制类型为四边形
GL.Vertex3(x / Screen.width, y / Screen.height, );//['vɜ:teks] n. 最高点;顶点
GL.Vertex3(x / Screen.width, (y + height) / Screen.height, );
GL.Vertex3((x + width) / Screen.width, (y + height) / Screen.height, );
GL.Vertex3((x + width) / Screen.width, y / Screen.height, );
GL.End();
GL.PopMatrix();
} /// <summary>
/// 绘制无规则的四边形
/// </summary>
/// <param name="x1">起始点1的横坐标</param>
/// <param name="y1">起始点1的纵坐标</param>
/// <param name="x2">起始点2的横坐标</param>
/// <param name="y2">起始点2的纵坐标</param>
/// <param name="x3">起始点3的横坐标</param>
/// <param name="y3">起始点3的纵坐标</param>
/// <param name="x3">起始点4的横坐标</param>
/// <param name="y3">起始点4的纵坐标</param>
/// <param name="material">material</param>
private void DrawQuads(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, Material material)
{
GL.PushMatrix();
material.SetPass();
GL.LoadOrtho();
GL.Begin(GL.QUADS);//绘制类型为四边形
GL.Vertex3(x1 / Screen.width, y1 / Screen.height, );
GL.Vertex3(x2 / Screen.width, y2 / Screen.height, );
GL.Vertex3(x3 / Screen.width, y3 / Screen.height, );
GL.Vertex3(x4 / Screen.width, y4 / Screen.height, );
GL.End();
GL.PopMatrix();
} // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

四、绘制三角形

  使用GL.Begin(GL.TRIANGLE)方法,参数为三角形的类型。['traɪæŋɡl]n. 三角形;三人一组;三角铁;三角板

using UnityEngine;
using System.Collections;
/// <summary>
/// 绘制三角形
/// 使用GL.Vertex3()方法确定三角形三个顶点的位置,并将绘制三角形
///的所有方法封装在DrawTriangle()方法中,最后使用GL.End()方法将三角形显示在屏幕中。
///需要说明的是,在调用DrawTriangle()方法时,需要将三个点的坐标与材质传入该方法。
/// </summary>
public class _7_5_4 : MonoBehaviour
{
/// <summary>
/// 材质
/// </summary>
public Material material; private void OnPostRender()
{
//绘制三角形
DrawTriangle(, , , , , , material);
}
/// <summary>
///绘制三角形
///Triangle n. 三角形;三人一组['traɪæŋɡl]
/// </summary>
private void DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, Material material)
{
material.SetPass();
GL.LoadOrtho();
GL.Begin(GL.TRIANGLES);//绘制三角形
GL.Vertex3(x1 / Screen.width, y1 / Screen.height, );
GL.Vertex3(x2 / Screen.width, y2 / Screen.height, );
GL.Vertex3(x3 / Screen.width, y3 / Screen.height, );
GL.End();
} // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

五、绘制3D几何图形

using UnityEngine;
using System.Collections; /// <summary>
/// 绘制 3D几何图形
/// </summary>
public class _7_5_5 : MonoBehaviour
{ #region 材质
public Material material0;
public Material material1;
public Material material2;
#endregion private void OnPostRender()
{
//绘制正四边形
DrawRect(, , , , material0);
DrawRect(, , , , material1);
//绘制无规则四边形
DrawQuads(, , , , , , , , material2);
}
/// <summary>
/// 绘制正四边形
/// </summary>
/// <param name="x">x轴起始坐标</param>
/// <param name="y">y轴起始坐标</param>
/// <param name="width">正四边形的宽</param>
/// <param name="height">正四边形的高</param>
/// <param name="material">material</param>
private void DrawRect(float x, float y, float width, float height, Material material)
{
GL.PushMatrix();
material.SetPass();
GL.Begin(GL.QUADS);//四边形
GL.Vertex3(x / Screen.width, y / Screen.height, );
GL.Vertex3(x / Screen.width, (y + height) / Screen.height, );
GL.Vertex3((x + width) / Screen.width, (y + height) / Screen.height, );
GL.Vertex3(x / Screen.width, (y + height) / Screen.height, );
GL.End();
GL.PopMatrix();
} /// <summary>
/// 绘制无规则四边形
/// </summary>
/// <param name="x1">起始点1的横坐标</param>
/// <param name="y1">起始点1的纵坐标</param>
/// <param name="x2">起始点2的横坐标</param>
/// <param name="y2">起始点2的纵坐标</param>
/// <param name="x3">起始点3的横坐标</param>
/// <param name="y3">起始点3的纵坐标</param>
/// <param name="x4">起始点4的横坐标</param>
/// <param name="y4">起始点4的纵坐标</param>
/// <param name="material">material</param>
private void DrawQuads(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4,
Material material)
{
GL.PushMatrix();//[ˈmeɪtrɪks] n. <数>矩阵;模型;基质;母体,子宫
material.SetPass();
GL.Begin(GL.QUADS);
GL.Vertex3(x1 / Screen.width, y1 / Screen.height, );
GL.Vertex3(x2 / Screen.width, y2 / Screen.height, );
GL.Vertex3(x3 / Screen.width, y3 / Screen.height, );
GL.Vertex3(x4 / Screen.width, y4 / Screen.height, );
GL.End();
GL.PopMatrix();
} // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

六、绘制线

  任何一个模型都由若干网格面组成,而每一个面又由若干个三角形组成,也就是说,模型是由若干个三角形面组成的

using UnityEngine;
using System.Collections; public class _7_5_7 : MonoBehaviour
{ #region 构成三角形1的三个顶点位置
Vector3 v0 = new Vector3(, , ); Vector3 v1 = new Vector3(, , ); Vector3 v2 = new Vector3(, , );
#endregion
//构成三角形2的三个顶点位置
Vector3 v3 = new Vector3(-, , );
Vector3 v4 = new Vector3(, -, );
Vector3 v5 = new Vector3(, , -);
//构成三角形1的贴图比例
Vector2 u0 = new Vector2(, );
Vector2 u1 = new Vector2(, );
Vector2 u2 = new Vector2(, );
//构成三角形2的贴图比例
Vector2 u3 = new Vector2(, );
Vector2 u4 = new Vector2(, );
Vector2 u5 = new Vector2(, ); // Use this for initialization
void Start()
{
//得到网格渲染器对象
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
Mesh mesh = meshFilter.mesh; //通过渲染器对象得到网格对象
mesh.vertices = new Vector3[] { v0, v1, v2, v3, v4, v5 };// n. 至高点,头顶;最高点( vertex的名词复数 );[ˈvə:tisi:z]
mesh.uv = new Vector2[] { v0, v1, v2, v3, v4, v5 };//设置三角形面上的贴图比例
mesh.triangles = new int[] { , , , , , };//[t'raɪæŋɡlz] n. 三角形( triangle的名词复数 );
} // Update is called once per frame
void Update()
{ }
}

Unity3D笔记十八 GL图像库的更多相关文章

  1. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  2. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  3. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  4. SharpGL学习笔记(十八) 解析3ds模型并显示

    笔者设想的3D仿真中的元件,是不可能都是“画”出来的.这样就玩复杂了,应该把任务分包出去,让善于制作模型的软件来制作三维模型,我们只需要解析并且显示它即可. 3dsmax制作三维模型的方便,快捷,专业 ...

  5. swift 笔记 (十八) —— 扩展

    扩展 扩展能够让我们给一个已有的类.结构体.枚举等类型加入�新功能,包含属性和方法,甚至是构造器,下标,支持协议等等... 甚至是我们拿不到源码的类.结构体.枚举,我们依旧能够给它加扩展... 看到这 ...

  6. MYSQL进阶学习笔记十八:MySQL备份和还原!(视频序号:进阶_37)

    知识点十九:MySQL的备份的还原(38) 一.mysql的备份 1.通过使用mysqldump的命令备份 使用mysqldump命令备份,mysqldump命令将数据库中的数据备份成一个文本文件.表 ...

  7. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  8. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...

  9. Java笔记(十八)……包

    概述 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称的是 包名.类名. 包也是一种封装形式. 访问权限 引用<The Complete Reference&g ...

随机推荐

  1. Linux下修改MySql的root密码

    linux下如何修改Mysql的root密码     今天,忘了mysql下的root密码,想重置一下,但找了多个网站上的方法均有问题,最后参考几家的过程,经过不断尝试获得,终于成功了,下面特将过程分 ...

  2. Java编程思想学习笔记——一切都是对象

    前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...

  3. Java常用数据结构之Set之TreeSet

    前言 上篇文章我们分析了HashSet,它是基于HashMap实现的,那TreeSet会是怎么实现的呢?没错!和大家想的一样,它是基于TreeMap实现的.所以,TreeSet的源码也很简单,主要还是 ...

  4. ADCD 1.9 ZOS 配置 CTCI-W32 TCPIP 网络

    试验步骤:两步走,第一步修改Hercules的配置文件 在hercules 配置文件末尾加上    0E20-0E21 CTCI     -n 0A-00-27-00-00-00  192.168.5 ...

  5. web front end stack web 前段技术概览

    https://github.com/unruledboy/WebFrontEndStack

  6. linux环境中,查看域名的DNS信息?

    需求说明: 今天在linux主机上,要查询一个域名是在哪个DNS上进行解析的,这个域名下面还有哪些的地址 操作过程: 1.linux环境中通过nslookup命令来进行查看 [deployer@CBS ...

  7. MySQL 高性能表设计规范

    良好的逻辑设计和物理设计是高性能的基石, 应该根据系统将要执行的查询语句来设计schema, 这往往需要权衡各种因素. 一.选择优化的数据类型 MySQL支持的数据类型非常多, 选择正确的数据类型对于 ...

  8. js中===与==区别

    本文出自:http://www.cnblogs.com/yiki/archive/2012/05/08/2489687.html 1.对于string,number等基础类型,==和===是有区别的 ...

  9. Java NIO原理 图文分析及代码实现

    Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...

  10. ssh事务回滚,纪念这几个月困扰已久的心酸

    以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回 ...