Unity3D笔记十八 GL图像库

article/2025/9/15 14:31:39

作者:PEPE 
出处:http://pepe.cnblogs.com/ 


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);//设置该材质通道,0为默认值GL.LoadOrtho();//设置绘制2D图像GL.Begin(GL.LINES);//表示开始绘制,绘制类型为线段DrawLine(0, 0, 200, 100);//绘制线段0DrawLine(0, 50, 200, 150);//绘制线段1DrawLine(0, 100, 200, 200);//绘制线段2GL.End();//结束绘制
    }private void DrawLine(float x1, float y1, float x2, float y2){//绘制线段,需要将屏幕中某个点的像素坐标除以屏幕宽或高GL.Vertex(new Vector3(x1 / Screen.width, y1 / Screen.height, 0));// ['vɜ:teks] n. 最高点;顶点;<数>(三角形、圆锥体等与底相对的)顶;GL.Vertex(new Vector3(x2 / Screen.width, y2 / Screen.height, 0));}// Use this for initializationvoid Start(){}// Update is called once per framevoid 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 initializationvoid Start(){//初始化鼠标线段链表lineInfo = new List<Vector3>();}// Update is called once per framevoid 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);//设置该材质通道,0为默认值GL.LoadOrtho();//设置绘制2D图像GL.Begin(GL.LINES);//表示开始绘制,绘制类型为线段 for (int i = 0; i < lineInfo.Count - 1; i++){Vector3 start = lineInfo[i];Vector3 end = lineInfo[i + 1];//绘制线段
            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, 0));// [ˈvɜ:ˌteks] 最高点;顶点GL.Vertex(new Vector3(x2 / Screen.width, y2 / Screen.height, 0));}
}
复制代码

 

三、绘制四边形

   绘制四边形,需要使用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(100, 100, 100, 100, material0);DrawRect(250, 100, 100, 100, material1);//绘制无规则四边形DrawQuads(15, 5, 10, 115, 95, 110, 90, 10, 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(0);GL.LoadOrtho();GL.Begin(GL.QUADS);//绘制类型为四边形GL.Vertex3(x / Screen.width, y / Screen.height, 0);//['vɜ:teks] n. 最高点;顶点GL.Vertex3(x / Screen.width, (y + height) / Screen.height, 0);GL.Vertex3((x + width) / Screen.width, (y + height) / Screen.height, 0);GL.Vertex3((x + width) / Screen.width, y / Screen.height, 0);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(0);GL.LoadOrtho();GL.Begin(GL.QUADS);//绘制类型为四边形GL.Vertex3(x1 / Screen.width, y1 / Screen.height, 0);GL.Vertex3(x2 / Screen.width, y2 / Screen.height, 0);GL.Vertex3(x3 / Screen.width, y3 / Screen.height, 0);GL.Vertex3(x4 / Screen.width, y4 / Screen.height, 0);GL.End();GL.PopMatrix();}// Use this for initializationvoid Start(){}// Update is called once per framevoid 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(100, 0, 100, 200, 200, 100, 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(0);GL.LoadOrtho();GL.Begin(GL.TRIANGLES);//绘制三角形GL.Vertex3(x1 / Screen.width, y1 / Screen.height, 0);GL.Vertex3(x2 / Screen.width, y2 / Screen.height, 0);GL.Vertex3(x3 / Screen.width, y3 / Screen.height, 0);GL.End();}// Use this for initializationvoid Start(){}// Update is called once per framevoid 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;#endregionprivate void OnPostRender(){//绘制正四边形DrawRect(100, 100, 100, 100, material0);DrawRect(250, 100, 100, 100, material1);//绘制无规则四边形DrawQuads(15, 5, 10, 115, 95, 110, 90, 10, 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(0);GL.Begin(GL.QUADS);//四边形GL.Vertex3(x / Screen.width, y / Screen.height, 0);GL.Vertex3(x / Screen.width, (y + height) / Screen.height, 0);GL.Vertex3((x + width) / Screen.width, (y + height) / Screen.height, 0);GL.Vertex3(x / Screen.width, (y + height) / Screen.height, 0);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(0);GL.Begin(GL.QUADS);GL.Vertex3(x1 / Screen.width, y1 / Screen.height, 0);GL.Vertex3(x2 / Screen.width, y2 / Screen.height, 0);GL.Vertex3(x3 / Screen.width, y3 / Screen.height, 0);GL.Vertex3(x4 / Screen.width, y4 / Screen.height, 0);GL.End();GL.PopMatrix();}// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}
}
复制代码

 

六、绘制线

 

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

复制代码
using UnityEngine;
using System.Collections;public class _7_5_7 : MonoBehaviour
{#region 构成三角形1的三个顶点位置Vector3 v0 = new Vector3(5, 0, 0);Vector3 v1 = new Vector3(0, 5, 0);Vector3 v2 = new Vector3(0, 0, 5);#endregion//构成三角形2的三个顶点位置Vector3 v3 = new Vector3(-5, 0, 0);Vector3 v4 = new Vector3(0, -5, 0);Vector3 v5 = new Vector3(0, 0, -5);//构成三角形1的贴图比例Vector2 u0 = new Vector2(0, 0);Vector2 u1 = new Vector2(0, 5);Vector2 u2 = new Vector2(5, 5);//构成三角形2的贴图比例Vector2 u3 = new Vector2(0, 0);Vector2 u4 = new Vector2(0, 1);Vector2 u5 = new Vector2(1, 1);// Use this for initializationvoid 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[] { 0, 1, 2, 3, 4, 5 };//[t'raɪæŋɡlz] n. 三角形( triangle的名词复数 );
    }// Update is called once per framevoid Update(){}
}
复制代码

 


http://chatgpt.dhexx.cn/article/5Sj7sikO.shtml

相关文章

Mapbox GL插件之echartsLayer

Mapbox GL除了本身的api具有的功能以外&#xff0c;还能够集成各种开源的类库。 ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;百度公司开发的&#xff0c;同时其中也有一些地图的效果。 Mapbox GL的echarts插件&#xff0c;在gith…

【OpenGL】十八、OpenGL 绘制多边形 ( 绘制 GL_POLYGON 模式多边形 )

文章目录 一、绘制 GL_POLYGON 模式多边形二、多边形绘制顺序分析三、相关资源 一、绘制 GL_POLYGON 模式多边形 使用 glBegin(GL_POLYGON) 设置绘制多边形 , 不管有几个点 , 都按照指定的顺序连接起来 ; 注意 : 这些点组成的多边形必须是凸多边形 , 不能是凹多边形 ; 代码示例…

gl_FragCoord 的含义

gl_FragCoord 表示当前片元着色器处理的候选片元窗口相对坐标信息&#xff0c;是一个 vec4 类型的变量 (x, y, z, 1/w)&#xff0c; 其中 x, y 是当前片元的窗口坐标&#xff0c;OpenGL 默认以窗口左下角为原点&#xff0c; 在 着色器中通过布局限定符可以重新设定原点&#xf…

WebGL着色器内置变量gl_PointSize、gl_Position、gl_FragColor、gl_FragCoord、gl_PointCoord

WebGL着色器内置变量 WebGL中文教程网 本文是WebGL教程(电子书)的2.7节内容 着色器语言在GPU的着色器单元执行&#xff0c;javascript语言、C语言在CPU上执行&#xff0c;任何一种语言的语法规则&#xff0c;整体设计都和它执行的硬件有一定的关系&#xff0c;GPU和CPU执行程…

Unity画线之GL

上一篇中&#xff0c;SetPixel的方法&#xff0c;卡顿严重&#xff0c;暂未解决&#xff0c;又去看了原来的GL画线&#xff0c;自己画图思考了一下适配UI的问题&#xff0c;最终解决。 特此说明&#xff0c;GL画线功能&#xff0c;及Shader均为借鉴&#xff0c;自己做了优化。…

GL823K

下面是另一家SD/TF解码芯片的方案 ![](https://img-blog.csdnimg.cn/20210319145313645.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTU3MDgwNA,size_16,color_FFFFFF,t_70 13030533945 VX

GL各个表结构总结

NewProgramer EBS GL表结构学习(转) gl_code_combinations&#xff1a;科目组合 字段名 含义 备注 code_combination_id 主键&#xff0c;科目编码ID&#xff0c;自动编号 segment1 分行代码 setgment2 是受益部门 segment3 科目代码 segment4 产品…

初识mapbox GL

一、概述 最近由于项目的需求&#xff0c;借此机会对mapbox GL做了一个系统的学习&#xff0c;同时也对整个学习过程做一个记录&#xff0c;一方面留作自用&#xff0c;另一方面也希望看到此文的人在学习mapbox GL的时候&#xff0c;能够有所启发、有所收获。 二、快速认识 …

支持Genero BDL 4gl语言的编辑器

内测版本出来啦。点此下载: FglDeveloper v1.0 →此版本已下架 还有bug,分享几张截图 模板产生器&#xff1a; 画面产生器&#xff1a; 编辑器各种变量提醒 详细功能小伙伴们下载后体验。

TOPGP5.3:导入jar包并在4GL中引用

查看环境$CLASSPATH 上传引用到的JAR包到以下目录 /u1/topprod/tiptop/ds4gl2/bin/javaad/jar 以上为GP5.3目录&#xff0c;其他版本系统可根据查看到的$CLASSPATH上传到相应目录设置环境变量 GP5.3系统中&#xff0c;$CLASSPATH环境变量的设置存在下图文件中&#xff1a; …

4gl调用WEB API,实现JSON传递(Demo)

测试环境: GP5.25 , fjs版本2.32,解析json所需要的jar依赖包 (PS: 如果没有记错是fjs2.32版本及以上才支持java bridge,所以GP 5.25以下的同学就不要用这种方式去测试) 测试内容: 利用此fjs版本对java bridge的支持,实现4gl调用WEB API,实现json传递 测试步骤如下: 1.下载本…

给大家展示一下4gl编辑器

&#xff08;正式版已发布点击下载&#xff09;特地为编辑器开发内置语法解析器&#xff0c;将在代码编辑过程中实时提示代码错误&#xff0c;并且错误提示都是中文显示(楼主英文太垃圾只有做中文了),不再需要频繁上传服务器了哦&#xff0c; 经过楼主努力已经把所有的内置函数…

【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记(1)

Genero FGL 学习 Genero FGL 简介Genero FGL 开发&#xff08;编译、连接、执行&#xff09;第一个程序 Hello World变量与运算符变量定义&#xff08;DEFINE&#xff09;预定义变量变量集合&#xff08;RECORD &#xff09;数据结构&#xff08;TYPE&#xff09;变量赋值&…

win10忘记密码重置密码,一行代码帮你解决

步骤如下&#xff1a; 1.右击windows图标&#xff0c;选择进入Windows PowerShell(管理员&#xff09; 2.敲入代码net user 加上你的用户名和新密码&#xff0c;Ok&#xff0c;问题解决&#xff0c;你就可以用你的新密码登陆了

win10 重置登录账户密码

在登陆界面按下强制关机&#xff08;重复3次&#xff09;。注意&#xff1a;不能进到登陆界面 出现下图时&#xff0c;选择“高级选项”&#xff1a; 选择“疑难解答”&#xff1a; 选择“高级选项”&#xff1a; 选择“命令提示符”&#xff1a; 在管理员窗口输入diskpart 回车…

服务器2008系统设置密码,win2008服务器设置密码

win2008服务器设置密码 内容精选 换一换 修改服务IP地址&#xff0c;并且将DNS地址指向本机&#xff0c;然后修改计算机名为server。安装AD域服务之后&#xff0c;机器名称会自动变成“主机名域名”的形式&#xff0c;例如server.huawei.com。在命令行下输入dcpromo.exe &#…

Win10系统修改开机密码

愚蠢的人才能进步&#xff0c;对于我这种记忆力差的人&#xff0c;密码这个东东随时忘&#xff0c;今天早上大无语事件&#xff0c;我自己都惊呆了&#xff0c;每天都用的办公电脑&#xff0c;今天死活想不起密码&#xff0c;死活打不开电脑&#xff0c;明明就是那些组合&#…

win10忘记密码_电脑忘记密码没关系,这招教你简单轻松改密码

相信"忘记电脑开机密码"这件事经常发生,忘记密码该怎么办呢?这个问题困扰了许多小伙伴,今天就教大家一种最简单的方法轻松重置电脑开机密码(本方法适用win10、win8、win7系统)。 划重点: 重置电脑开机密码一共分为三个步骤「 制作PE系统」「进入PE系统 」「重置密…

win10计算机默认用户名和密码是什么,win10共享的文件夹需要密码和用户名登陆...

一、共享文件夹所在电脑设置 1、右键我的电脑→管理→系统工具→本地用户和组→用户→中间空白区域右键→新用户&#xff1b; 2、输入自设的用户名和密码&#xff0c;如图勾选→创建&#xff1b; 3、右键需要共享的文件见→安全→编辑&#xff1b; 4、点击添加&#xff1b; 5、…

WIN10取消密码和休眠密码

安装Win10系统之后&#xff0c;发现每次开机都会出现登录密码&#xff1f;有些用户觉得很麻烦&#xff0c;所以想要取消Win10开机密码。那么&#xff0c;该如何操作呢&#xff1f; 按下winx组合键&#xff0c;启动快捷菜单 在弹出菜单选择运行&#xff0c;如下图所示 在运行框…