using UnityEngine;
using System.Collections;

public class DrawRectangle : MonoBehaviour {

public Color rectColor = Color.green;

private Material rectMat = null;//画线的材质 不设定系统会用当前材质画线 结果不可控

// Use this for initialization

void Start () {

rectMat = new Material( "Shader \"Lines/Colored Blended\" {" +

"SubShader { Pass { " +

" Blend SrcAlpha OneMinusSrcAlpha " +

" ZWrite Off Cull Off Fog { Mode Off } " +

" BindChannels {" +

" Bind \"vertex\", vertex Bind \"color\", color }" +

"} } }" );//生成画线的材质

rectMat.hideFlags = HideFlags.HideAndDontSave;

rectMat.shader.hideFlags = HideFlags.HideAndDontSave;

}

void Update () {
}

void OnPostRender() {//画线这种操作推荐在OnPostRender()里进行 而不是直接放在Update,所以需要标志来开启

Rect rect0 = new Rect(0,0,0,0);

drawRect(rect0);

}

void drawRect(Rect rect0){
if (! rectMat)
return;
GL.PushMatrix();//保存摄像机变换矩阵
rectMat.SetPass( 0 );

GL.LoadPixelMatrix();//设置用屏幕坐标绘图

// GL.Begin(GL.QUADS);

// GL.Color( new Color(rectColor.r,rectColor.g,rectColor.b,0.1f) );//设置颜色和透明度,方框内部透明

// GL.Vertex3( 0,0,0);

// GL.Vertex3( Screen.width/2,0,0);

// GL.Vertex3( Screen.width/2,Screen.height/2,0 );

// GL.Vertex3( 0,Screen.height/2,0 );

// GL.End();
float startX = rect0.x;
float startY = rect0.y;
float endX = rect0.xMax;
float endY = rect0.yMax;

GL.Begin(GL.LINES);

GL.Color(rectColor);//设置方框的边框颜色 边框不透明

GL.Vertex3( startX,startY,0);
GL.Vertex3( endX,startY,0);

GL.Vertex3( endX,startY,0);
GL.Vertex3( endX,endY,0 );

GL.Vertex3( endX,endY,0 );
GL.Vertex3( startX,endY,0 );

GL.Vertex3( startX,endY,0 );
GL.Vertex3( startX,startY,0);

GL.End();
// GL.Begin(GL.LINES);
// GL.Vertex3(0, 0, 0);
// GL.Vertex3(Screen.width, Screen.height, 0);
// GL.End();
GL.PopMatrix();//恢复摄像机投影矩阵
}

void drawRects(Rect[] rects){
if (! rectMat)
return;
GL.PushMatrix();//保存摄像机变换矩阵
rectMat.SetPass( 0 );

GL.LoadPixelMatrix();//设置用屏幕坐标绘图

// GL.Begin(GL.QUADS);

// GL.Color( new Color(rectColor.r,rectColor.g,rectColor.b,0.1f) );//设置颜色和透明度,方框内部透明

// GL.Vertex3( 0,0,0);

// GL.Vertex3( Screen.width/2,0,0);

// GL.Vertex3( Screen.width/2,Screen.height/2,0 );

// GL.Vertex3( 0,Screen.height/2,0 );

// GL.End();
GL.Begin(GL.LINES);
for(int i = 0 ; i < rects.Length ; i++){

Rect rect0 = rects[i];
//Debug.Log(rect0);
float startX = rect0.x;
float startY = rect0.y;
float endX = rect0.xMax;
float endY = rect0.yMax;

GL.Color(rectColor);//设置方框的边框颜色 边框不透明

GL.Vertex3( startX,startY,0);
GL.Vertex3( endX,startY,0);

GL.Vertex3( endX,startY,0);
GL.Vertex3( endX,endY,0 );

GL.Vertex3( endX,endY,0 );
GL.Vertex3( startX,endY,0 );

GL.Vertex3( startX,endY,0 );
GL.Vertex3( startX,startY,0);

}
GL.End();
// GL.Begin(GL.LINES);
// GL.Vertex3(0, 0, 0);
// GL.Vertex3(Screen.width, Screen.height, 0);
// GL.End();
GL.PopMatrix();//恢复摄像机投影矩阵

}
}

Unity之屏幕画线的更多相关文章

  1. Unity使用GL画线

    脚本需挂在相机上,如果你的脚本,编辑器报错了,Matrix stack full depth reached,加上这个方法试试GL.LoadPixelMatrix(); using System.Co ...

  2. unity3d之在屏幕上画线

    如何在屏幕上画线,简单的代码如下: using UnityEngine; public class Test : MonoBehaviour { void OnGUI() { GL.LoadOrtho ...

  3. android 屏幕上面画线

    作业如下:在android屏幕上面任意画线 package feng.f121.drawline;//本人创建的包名,每人有每人的不同的包 import java.security.PublicKey ...

  4. Android中Path类的lineTo方法和quadTo方法画线的区别

    转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...

  5. Unity3D 画线插件 Vectrosity_Simple2DLine

    Vectrosity是一个很方便的画线插件,用它我们可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案. :链接: http://pan.baidu.com/s/1pJjTFjt 密码: uesn 首 ...

  6. VC动态轨迹画线

    分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...

  7. android中实现在ImageView上随意画线涂鸦

    我实现的思路: 1.继承ImageView类 2.重写onTouchEvent方法,在ACTION_MOVE(即移动时),记录下所经过的点坐标,在ACTION_UP时(即手指离开时,这时一条线已经画完 ...

  8. Delphi下OpenGL2d绘图(03)-画线

    一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...

  9. OpenGL进阶演示样例1——动态画线(虚线、实线、颜色、速度等)

            用OpenGL动态绘制线段.事实上非常easy,但到如今为止.网上可參考资料并不多. 于是亲自己主动手写一个函数,方便动态绘制线段.代码例如以下: #include<GL/glu ...

随机推荐

  1. DOM-判断元素节点类型

    http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-i ...

  2. Window.navigator

    定义和用法 userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值. 一般来讲,它是在 navigator.appCodeName 的值之后加上斜线和 navig ...

  3. Win7中使用Eclipse连接虚拟机中的Ubuntu中的Hadoop2.4&lt;3&gt;

    经过前几天的学习,基本上能够小试牛刀编写一些小程序玩一玩了,在此之前做几项准备工作 明白我要用hadoop干什么 大体学习一下mapreduce ubuntu重新启动后,再启动hadoop会报连接异常 ...

  4. hdu 5264 pog loves szh I 水题

    pog loves szh I Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  5. Android C2DM学习 - 云端推送

    一.基础知识 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震及时通>就需要及时获取服务器上最新的地震信息.要获取服务器上不定时更新的信息一般来说有两种方 ...

  6. PHP apache2.2 mysql 的安装

    1.安装准备 我的系统为win7 旗舰版 php:http://windows.php.net/downloads/releases/php-5.3.6-Win32-VC9-x86.zip mysql ...

  7. .net 调用C++类库

    事实上这一直是个非常无解的问题.最好的办法是将C++类库写成COM. 可是有时候往往不能这个做.那就仅仅有两种办法:转成C函数形式或者Manage C++封装. 下文就介绍了这两种方法. 原帖:htt ...

  8. Gtest源码剖析:1.实现一个超级简单的测试框架xtest

    下面的代码模仿gtest实现,主要说明了以下两点: ASSERT_* 和 EXPECT_*系列断言的原理和作用. gtest是怎样通过宏自动注册测试代码让其自动运行的. #include <io ...

  9. android学习日记13--数据存储之ContentProvide

    3.ContentProvider 数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.ContentProvider实现多应用程序间的数据共享类一般利用Co ...

  10. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html   类string的构造函数.拷贝构造 ...