Unity之屏幕画线

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();//恢复摄像机投影矩阵

}
}

时间: 2024-11-07 19:46:59

Unity之屏幕画线的相关文章

unity3d GL画线/物体跟随/坐标系转换

看见标题的人是不是在想... 一个小小的GL画线难吗? 一个小小的物体跟随难吗? 嗯,的确,一点不难.... 我一开始也是像你们那样想的,但是实际操作起来,还是和理论有区别的 写这个demo起因是这样的: 面试到了一家虚拟现实的公司,因为没有去公司 网上直接谈的,谈妥了hr估计是想看看我能不能胜任 给了我一张效果图,让我去实现画线的功能 咳咳,要求还是比较细致的,这里我们后面说 废话不多说,老规矩,先上效果图,然后直接进入主题 第一张是hr给我的图,第二张是我自己实现的 需求如下: 1.模型是旋

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

用OpenGL动态绘制线段,其实很简单,但到现在为止,网上可参考资料并不多.于是亲自动手写一个函数,方便动态绘制线段.代码如下: #include<GL/glut.h> //OpenGL实用工具包 #include <Windows.h> /*所遇问题: 1.系统API函数Sleep()不听话,睡眠时快时慢(可能跟我计算机当前运行程序有关吧) 解决方案:重写Sleep()函数,实质为空循环.仅用于Debug下,Release会将其优化 2.动态画直线,朝某些方向画线时出现块状 解决

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

当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的lineTo和quadTo方法实现的绘制线路形式也是不一样的,下面就以代码的实现来直观的探究这两个方法的功能实现区别: 1. Path--->quadTo(float x1, float y1, float x2, float y2): 该方法的实现是当我们不仅仅是画一条线甚至是画弧线时会形成平滑的曲线,该曲线又称为"贝塞尔曲线"(Bezier curve),其中,x1,y1为控制点的坐标值,x2,y2为终

VC几种不同的画线方法

1. 画线 方法I:使用HDC (SDK模式) HDC hDC; hDC = ::GetDC(m_hWnd); //此处要用全局的::GetDC,否则默认用CDC的. MoveToEx(hDC, point1.x, point1.y, NULL); //MoveToEx,先移到初始点,然后再画线 LineTo(hDC, point2.x, point2.y); ::ReleaseDC(m_hWnd, hDC); //释放也要用全局::ReleaseDC 方法II:使用CDC(MFC模式) CDC

计算机图形学(二)输出图元_3_画线算法_1_直线方程

画线算法 场景中的直线段由其两端点的坐标位置来定义.要在光栅监视器上显示一线段,图形系统必须先将两端点投影到整数屏幕坐标,并确定离两端点间的直线路径最近的像素位置.接下来将颜色值装人帧缓存相应的像素坐标处.视频控制器从帧缓存读出写入的颜色值并绘制屏幕像素.这一过程将一线段数字化为一组离散的整数位置.一般而言,这些位置是实际线路径的近似.例如,计算出的线位置(10.48, 20.51)转换为像素位置(10, 21).坐标值舍入到整数,引起除水平和垂直以外所有线段的阶梯效应("锯齿形"),

Delphi下OpenGL2d绘图(03)-画线

一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二.画线 GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段 GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段 GL_LINE_LOOP:绘制从第一个顶点到最后一

计算机图形学(二)输出图元_4_并行画线算法

并行画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                            上面讨论过的线段生成算法顺序地确定像素位置.而利用并行计算机,则可通过将计算分割到可用的多个处理器中来得到线段的像素位置.分割问题的一种解决方法是将现有的顺序算法放到多个处理器上.我们也可以寻找其他处理办法,从而使像素位置能以并行方式有效地计算.在设计并行算法中,重要的是要考虑平衡可用处理器间的处理负载. 给定np个处理器,我们可以通过把线段分割成np个子段,并在每

计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法

Bresenham画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                         Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算.另外Bresenham算法还可用于显示圆和其他曲线.图3.8和图3.9给出了绘制线段的屏幕局部.垂直轴表示扫描线位置,水平轴标识像素列.在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径.从图3.

用OpenGL画线

. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常会提供一些绘制基本图形的接口,这些基本图形称之为图元,而OpenGL提供了点,线段,三角形三种图元绘制接口,说出来你可能不信,OpenGL就只能绘制这三种图形,本篇博文的主题是画线,OpenGL能直接绘制的图元之一. 用OpenGL绘制线段图元 给出两点的坐标,调用API即可直接画出线段. // 伪