文章目录

  • 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基本应用相关推荐

  1. 《Fundamentals Of Computer Graphics》虎书第三版翻译——第六章 矩阵变换

    线性代数的机制可以用来表达在3D场景中排列对象.用摄像机观察它们并将它们放到屏幕上所需的许多操作.几何变换,如旋转.平移.缩放和投影可以通过矩阵乘法来完成,而用于实现这一目的的变换矩阵是本章的主题.我 ...

  2. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...

  3. 【转】iOS-Core-Animation-Advanced-Techniques(六)

    原文:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇 ...

  4. 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理

    第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...

  5. 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 ...

  6. 经典C语言程序100例之五六

    经典C语言程序100例之五六 如题 话不多说了,直接上代码 如题 [程序56] 题目:画图,学用circle画圆形. 1.程序分析: 话不多说了,直接上代码 2.程序源代码: /circle/ #in ...

  7. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  8. 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...

  9. python画圆并填充图形颜色_如何使用python设计语言graphics绘制圆形图形

    在python设计语言中,可以利用第三方包graphics绘制不同的图形,有圆形.直线.矩形等.如果想要绘制一个圆形,可以设置圆形的半径和坐标位置.下面利用一个实例说明绘制圆形,操作如下: 工具/原料 ...

  10. 菜鸟学Java(六)——简单验证码生成(Java版)

    转载自  菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...

最新文章

  1. 符合python语言变量命名规则_Python变量命名规则
  2. 36晋级12第四场:评委弃权 无人晋级
  3. Linux中的盘符问题
  4. Monte Carlo概率模型进行分子动力学模拟并计算苯甲醚键值
  5. 新买的笔记本电脑怎么分盘_电脑怎么增加C盘空间?黑客教你不花钱增加C盘空间...
  6. 快速游戏开发工具GameMaker,Action Game Maker使用体验
  7. mysql drop库_Mysql 删除数据库drop database详细介绍
  8. 重温设计模式之 Factory
  9. Android 获取CellId以及IMEI 获取基站id
  10. C# 理解Thread.Sleep()方法 ----转帖
  11. 鸟哥的私房菜-基础篇学习-文件与目录管理-2-1
  12. 取消服务器系统,取消系统服务器默认共享通道的方法
  13. linux 构造函数 throw,在自定义异常的方法/构造函数签名中带和不带throw()的C++...
  14. authware课件
  15. 全球十大外汇交易平台2020最新排名
  16. ERP系统实施之入门
  17. 《Java高级程序设计》清华大学出版社 徐传远 课后习题答案
  18. 人民币对美元汇率中间价报6.7472元 上调469个基点
  19. bzoj2115 线性基 异或
  20. 十五数码难题 A*算法及深度优先算法实现

热门文章

  1. 自媒体必死 大家不要被马化腾忽悠了
  2. 13946 问题 E: 积木游戏
  3. 高颜值生物信息在线绘图工具
  4. 使用python PIL 模块合成图片
  5. web网页设计期末课程大作业——电影介绍5页HTML+CSS制作
  6. python 去掉标点、数字、特殊符号_python中怎么去掉标点符号
  7. Usability: Rules and Principle
  8. 本地服务启动慢问题及dubbo测试方法记录
  9. 计算机鼠标左键不起作用,电脑鼠标左键突然不好用了 右键没问题
  10. 阿里云OSS线程增长问题分析