使用Unity GL库绘制图像

使用Unity自带的GL函数库在屏幕上绘制一些特殊的图形,如圆、线条、曲线、矩形等一些图形,并可以给绘制的图形指定相应的纹理。但是,使用GL绘制图形的纹理使用的Shader有一些限制,仅支持如下Shader:


  1. Particles->VertexLit Vlended
  2. Unlit->Color
  3. Unlit->Texture
  4. Unlitr->Transparent
  5. Legacy Shader->Transparent->VertexLit

以下代码展示在屏幕上绘制一张带透明通道纹理:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GLTest : MonoBehaviour {public Material mat_Transparent;void OnPostRender () {DrawQuads(new Rect(0,0,300,300),mat_Transparent);  }/// <summary>/// 绘制一个面片,绘制坐标为屏幕坐标,原点位于屏幕的左下角/// </summary>/// <param name="rect.x">rect.x表示绘制图形的X坐标</param>/// <param name="rect.y">rect.x表示绘制图形的Y坐标</param>/// <param name="rect.width">rect.x表示绘制图形的宽度</param>/// <param name="rect.height">rect.x表示绘制图形的高度</param>/// <param name="mat">指定一个材质</param>void DrawQuads(Rect rect,Material mat){GL.PushMatrix ();mat.SetPass (0);GL.LoadOrtho ();GL.Begin (GL.QUADS);GL.TexCoord2(0,0);GL.Vertex3(rect.x/Screen.width,rect.y/Screen.height,0);GL.TexCoord2(0,1);GL.Vertex3(rect.x/Screen.width,(rect.y+rect.height)/Screen.height,0);GL.TexCoord2(1,1);GL.Vertex3((rect.x+rect.width)/Screen.width,(rect.y+rect.height)/Screen.height,0);GL.TexCoord2(1,0);GL.Vertex3((rect.x+rect.width)/Screen.width,rect.y/Screen.height,0);GL.End();GL.PopMatrix();}
}

坐标示例:


将脚本挂载到摄像机上,赋予相应的材质。

利用这个函数配合RenderTexture和Shader可以实现一些比如橡皮擦、刮刮卡之类的效果
以下分享一个实现橡皮擦效果的Shader,大致原理就是:将两张纹理叠加采样,一张纹理作为主颜色纹理,一张纹理作为遮罩纹理,通过改变遮罩纹理的Alpha值,取主纹理的RGB颜色,用Mask的A值作为主颜色纹理的A值。

Shader "ScratchCard/Mask" {Properties {_MainTex ("Main", 2D) = "white" {}_MaskTex ("Mask", 2D) = "white" {}}SubShader {Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}ZWrite OffZTest OffBlend SrcAlpha OneMinusSrcAlphaPass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;sampler2D _MaskTex;float4 _MainTex_ST;float4 _MaskTex_ST;struct a2v{float4 position: POSITION;half4 color: COLOR;float2 texcoord: TEXCOORD0;};struct v2f{float4 position: POSITION;half4 color: COLOR;float2 texcoord: TEXCOORD0;};v2f vert(a2v i){v2f o;o.position = UnityObjectToClipPos(i.position);o.color = i.color;o.texcoord = TRANSFORM_TEX(i.texcoord, _MainTex);return o;}fixed4 frag(v2f v) : COLOR{fixed4 main_color = tex2D(_MainTex, v.texcoord);fixed4 mask_color = tex2D(_MaskTex, v.texcoord);fixed4 value = fixed4(v.color.r * main_color.r, v.color.g * main_color.g, v.color.b * main_color.b, v.color.a * main_color.a * (1.0f - mask_color.a));return value;}ENDCG}}
}

实现效果如下图:


具体实现的C#代码我会在后序的文章中分享。

更多内容,欢迎访问:


Unity GL函数库的简单使用相关推荐

  1. 如何在HTML中引用jQuery函数库

    要使用jQuery,我们要知道,jQuery是一个函数库,简单来讲就是一个后缀名为".js"的文件.我们可以在这里找到jQuery的最新版本文件:http://jquery.com ...

  2. @lisp 函数库 - CAD应用云

    @lisp 函数库 @lisp 函数库是一个开源.共享.可云端加载的 autolisp 函数库.由像您一样热爱开源共享的爱好者所构筑并维护.可依据开放许可协议自由使用. @lisp函数库功能涉及 图元 ...

  3. 开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)...

    2019独角兽企业重金招聘Python工程师标准>>> 开源纯C日志函数库iLOG3快速入门(八.如果你喜欢简单日志函数甚于日志函数库) 很多网友来信坚持表达了在项目中应使用简单日志 ...

  4. ibm ilog mysql_开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)...

    开源纯C日志函数库iLOG3快速入门(八.如果你喜欢简单日志函数甚于日志函数库) 很多网友来信坚持表达了在项目中应使用简单日志函数,而不喜欢日志函数库,我与之反复争论无果,不过话说回来,我也喜欢短小轻 ...

  5. python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...

    [单选题]Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大? 更多相关问题 [问答题,简答题] 顾客关系管理系统如何给企业 ...

  6. 开源纯C日志函数库iLOG3快速入门(五、与随手写的简单写日志函数的比较)

    2019独角兽企业重金招聘Python工程师标准>>> 前几天看到一个网友的评论:"这种一般自己实现个用用就行了 没必要整第三方库". 的确,很多个人或公司都自己 ...

  7. 最简单C/C++数据可视化函数库MathGL配置方法

    1.简介: MathGL是一个可用于C/C++数据可视化的函数库,可以对不同种类的数据进行可视化.由于MathGL本身不具有显示功能,需要配合opencv以及其他可视化工具才能够显示图形. 由于目前绝 ...

  8. OpenGL GLFX开放GL效果库

    Open GLFX开放GL效果库 OpenGL GLFX开放GL效果库简介 源代码剖析 主要源代码 OpenGL GLFX开放GL效果库简介 本课与前一课略有不同.我们将讨论 OpenGL 效果库 G ...

  9. openGL库的简单配置

    主要是针对openGL的一些初步的学习,因为openCV主要是处理图像视频,是从现有的得到数据,而openGL好像是从数据进行绘图,学习一下.在<计算机图形学编程>一书中,它把图形编程定性 ...

最新文章

  1. 【连载】优秀程序员的 45 个习惯之习惯35
  2. zatree插件优化:优化左侧边栏
  3. python学习之if语句
  4. 一个应届产品狗的产品日记【第二部:学做产品】
  5. 一文看懂Python(八)-----内置高阶函数用法总结
  6. CSS :before :after 伪类选择器
  7. 【解决问题】useBean类属性[com.cheng.pojo.People]的值无效导致HTTP500问题
  8. [django]django模型中auto_now和auto_now_add
  9. python里面的函数
  10. 【鱼眼镜头3】[鱼眼畸变模型]:除法模型(核密度估计径向失真校正方法)
  11. 编码转换的php小脚本,php编码转换小例子
  12. 256QAM调制映射表
  13. css字竖排垂直居中显示,CSS--字体|垂直居中|background
  14. 华为USG防火墙搭建IPsec***实战
  15. html隐藏域倒计时,一个网页倒计时的实现
  16. 根据当前谷歌浏览器版本获取或更新更新chromedriver.exe
  17. 华盛顿大学华人团队进入微软Imagine Cup总决赛!
  18. java软件高级工程师证书,分分钟搞定!
  19. windows系统DOS窗口
  20. 计算机网络题库类型 (建议收藏)

热门文章

  1. 案例研究 | 瓜子二手车战略升级三部曲
  2. ue4打包h5_ue4学习之嵌入H5网页(web Brower)
  3. 家谱管理系统php,家谱管理系统(含源代码).docx
  4. 初识mac 之设置篇
  5. 2022华中杯数学建模思路
  6. 安装Office 2016时报错Office 16 Click-to-Run Extensibility Component的处理办法
  7. VMWare安装Kali Linux(4-4)
  8. 【程序设计基础 学习笔记】单向链表(TBC)
  9. jquery动态加载图片数据
  10. Linux-dd命令详解