(六)Graphics基本应用
文章目录
- 1.前言
- 2.Draw Texture
- 2.1 ToScreen
- 2.1.1 调用位置
- 2.2 ToTarget
- 3.Draw Mesh
- 3.1 Update中调用
- 3.2 OnPostRender中调用
- 4.完整代码
- 5.结语
1.前言
本文主要针对Graphics类进行texture和mesh的绘制。
2.Draw Texture
使用Graphics类直接进行Texture绘制时,由于属于直接绘制到平面上,所以需要转换到平面像素空间内,所以需要用到LoadPixelMatrix方法。对于空间转换可以参考这一节
2.1 ToScreen
示例代码:
public void Dmainxture(){GL.PushMatrix();//GL.LoadPixelMatrix();GL.LoadPixelMatrix(0,Screen.width,Screen.height,0);Graphics.DrawTexture(new Rect(0, 0, 200, 100), mainTexture);GL.PopMatrix();}
代码中Graphics.DrawTexture使用的是最基本的方法,即将mainTexture绘制到屏幕new Rect(0, 0, 200, 100)的范围内。此方法有很多重载,可以根据自己的需求选择不同的方法。
使用GL.LoadPixelMatrix()(代码中注释掉的部分)进行坐标转换时,mainTexture会被绘制在屏幕左下角区域,但是像素上下是反的。这是由于不同的图形接口,texture对应的坐标原点不同。OpenGl为左下角,D3d为左上角。如果使用GL.LoadPixelMatrix(0,Screen.width,Screen.height,0)则像素不会反转,但是由于坐标变换矩阵变成从上到下,所以绘制屏幕的左上角。
2.1.1 调用位置
由于是绘制在屏幕上,所以只能在OnGui方法和OnPostRender中调用,在update中则会被camera渲染时会clear掉。但是如果将texture绘制到一个RenderTexture中则可以在update中可以。
2.2 ToTarget
示例代码:
public void DrawTextureToTarget(){Graphics.SetRenderTarget(target);clearBuffer.Clear();clearBuffer.ClearRenderTarget(true, true, clearColor);Graphics.ExecuteCommandBuffer(clearBuffer);GL.PushMatrix();GL.LoadPixelMatrix(0, target.width, target.height, 0);//GL.LoadPixelMatrix(0, target.width, 0, target.height);Graphics.DrawTexture(new Rect(0, 0, target.width, target.height), mainTexture);GL.PopMatrix();}
Graphics.SetRenderTarget(target);将绘制结果绘制在一个RenderTexture类型的变量target上,所以屏幕变换需要使用GL.LoadPixelMatrix(0, target.width, target.height, 0);,此时可以在update中调用。
3.Draw Mesh
3.1 Update中调用
示例代码:
public void DrawMesh(){Graphics.DrawMesh(Graphics00Mesh.Instance.GetMesh(10, 5), Matrix4x4.identity, material, 0);//Graphics.DrawMesh(Graphics00Mesh.Instance.GetMesh(10, 5), center,Quaternion.identity, material, 0);}
Graphics.DrawMesh同样有很多重载,可以满足众多需求,文中只给出了两个示例,一个通过提供矩阵进行坐标变换,另一个(注释掉的方法)则通过提供mesh所在的位置和旋转在进行定位。由于时绘制的模型,所以只能在update中调用。
3.2 OnPostRender中调用
在渲染阶段调用只能使用Graphics.DrawMeshNow方法,让指令立即生效。
4.完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;public enum DrawLocation
{ONGUI,POSTRENDER,UPDATE
}public class Graphics06Graphics : MonoBehaviour
{public DrawLocation location = DrawLocation.ONGUI;public bool toTarget = false;public Texture mainTexture;public RenderTexture target;public Color clearColor = Color.red;CommandBuffer clearBuffer;void Draw(){if (toTarget){DrawTextureToTarget();}else{DrawTexture();}}public void DrawTexture(){GL.PushMatrix();//GL.LoadPixelMatrix();GL.LoadPixelMatrix(0,Screen.width,Screen.height,0);Graphics.DrawTexture(new Rect(0, 0, 200, 100), mainTexture);GL.PopMatrix();}public void DrawTextureToTarget(){Graphics.SetRenderTarget(target);clearBuffer.Clear();clearBuffer.ClearRenderTarget(true, true, clearColor);Graphics.ExecuteCommandBuffer(clearBuffer);GL.PushMatrix();GL.LoadPixelMatrix(0, target.width, target.height, 0);//GL.LoadPixelMatrix(0, target.width, 0, target.height);Graphics.DrawTexture(new Rect(0, 0, target.width, target.height), mainTexture);GL.PopMatrix();}private void Start(){clearBuffer = new CommandBuffer() { name = "Clear Buffer" };}private void OnGUI(){if (location != DrawLocation.ONGUI) return;if (Event.current.type.Equals(EventType.Repaint)){Draw();}}private void Update(){if (location != DrawLocation.UPDATE) return;//如果此时绘制到屏幕上,则不会看到绘制的结果Draw();}private void OnPostRender(){if (location != DrawLocation.POSTRENDER) return;Draw();}
}
5.结语
由于将mesh绘制到RenderTexture上稍微麻烦一点,还涉及到贴图等问题,所以单独在下一节中讲解分析。
(六)Graphics基本应用相关推荐
- 《Fundamentals Of Computer Graphics》虎书第三版翻译——第六章 矩阵变换
线性代数的机制可以用来表达在3D场景中排列对象.用摄像机观察它们并将它们放到屏幕上所需的许多操作.几何变换,如旋转.平移.缩放和投影可以通过矩阵乘法来完成,而用于实现这一目的的变换矩阵是本章的主题.我 ...
- 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结
达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...
- 【转】iOS-Core-Animation-Advanced-Techniques(六)
原文:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇 ...
- 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理
第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...
- main 函数解析(二)—— Linux-0.11 学习笔记(六)
main函数解析(二)--Linux-0.11 学习笔记(六) 4.6 blk_dev_init函数 void blk_dev_init(void) {int i;for (i=0 ; i<NR ...
- 经典C语言程序100例之五六
经典C语言程序100例之五六 如题 话不多说了,直接上代码 如题 [程序56] 题目:画图,学用circle画圆形. 1.程序分析: 话不多说了,直接上代码 2.程序源代码: /circle/ #in ...
- Android Animation学习(六) View Animation介绍
Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...
- 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结
实验十六 线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...
- python画圆并填充图形颜色_如何使用python设计语言graphics绘制圆形图形
在python设计语言中,可以利用第三方包graphics绘制不同的图形,有圆形.直线.矩形等.如果想要绘制一个圆形,可以设置圆形的半径和坐标位置.下面利用一个实例说明绘制圆形,操作如下: 工具/原料 ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
转载自 菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...
最新文章
- 符合python语言变量命名规则_Python变量命名规则
- 36晋级12第四场:评委弃权 无人晋级
- Linux中的盘符问题
- Monte Carlo概率模型进行分子动力学模拟并计算苯甲醚键值
- 新买的笔记本电脑怎么分盘_电脑怎么增加C盘空间?黑客教你不花钱增加C盘空间...
- 快速游戏开发工具GameMaker,Action Game Maker使用体验
- mysql drop库_Mysql 删除数据库drop database详细介绍
- 重温设计模式之 Factory
- Android 获取CellId以及IMEI 获取基站id
- C# 理解Thread.Sleep()方法 ----转帖
- 鸟哥的私房菜-基础篇学习-文件与目录管理-2-1
- 取消服务器系统,取消系统服务器默认共享通道的方法
- linux 构造函数 throw,在自定义异常的方法/构造函数签名中带和不带throw()的C++...
- authware课件
- 全球十大外汇交易平台2020最新排名
- ERP系统实施之入门
- 《Java高级程序设计》清华大学出版社 徐传远 课后习题答案
- 人民币对美元汇率中间价报6.7472元 上调469个基点
- bzoj2115 线性基 异或
- 十五数码难题 A*算法及深度优先算法实现