Unity用GL库画线

真机调试时,有时候需要在屏幕中快速添加一些调试信息,如人物的碰撞盒, 准星范围等,可用gl在屏幕上画矩形圆形等来显示:

开始绘制:

void Begin (Color color)
{
    if (s_material == null)
        s_material = new Material (Shader.Find ("Unlit/Color"));
        s_material.SetPass (0);
        GL.LoadOrtho ();
        GL.Begin (GL.LINES);
        s_material.SetColor ("_Color", color);
}

结束绘制:

void End ()
{
    GL.End ();
}

绘制矩形:

public void DrawScreenRect(Rect rect, Color color)
{
    Begin (color);

    GL.Vertex3 (rect.xMin / Screen.width, rect.yMin / Screen.height, 0);
    GL.Vertex3 (rect.xMin / Screen.width, rect.yMax / Screen.height, 0);

    GL.Vertex3 (rect.xMin / Screen.width, rect.yMax / Screen.height, 0);
    GL.Vertex3 (rect.xMax / Screen.width, rect.yMax / Screen.height, 0);

    GL.Vertex3 (rect.xMax / Screen.width, rect.yMax / Screen.height, 0);
    GL.Vertex3 (rect.xMax / Screen.width, rect.yMin / Screen.height, 0);

    GL.Vertex3 (rect.xMax / Screen.width, rect.yMin / Screen.height, 0);
    GL.Vertex3 (rect.xMin / Screen.width, rect.yMin / Screen.height, 0);

    End ();
}

绘制椭圆:

public void DrawScreenEllipse(Vector2 center, float xRadius, float yRadius, Color color, int smooth = 50)
{
    Begin (color);
    for (int i = 0; i < smooth; ++i)
    {
        int nextStep = (i + 1) % smooth;
        GL.Vertex3 ((center.x + xRadius * Mathf.Cos (2 * Mathf.PI / smooth * i)) / Screen.width,
        (center.y + yRadius * Mathf.Sin (2 * Mathf.PI / smooth * i)) / Screen.height, 0);
        GL.Vertex3 ((center.x + xRadius * Mathf.Cos (2 * Mathf.PI / smooth * nextStep)) / Screen.width,
        (center.y + yRadius * Mathf.Sin (2 * Mathf.PI / smooth * nextStep)) / Screen.height, 0);
    }

    End ();
}
时间: 2024-11-07 11:10:10

Unity用GL库画线的相关文章

unity3d 使用GL 方式画线

这个是画线部分 private Vector3[] linePoints; public int m_LineCount; public int m_PointUsed; public void RenderPath() { GL.Begin(GL.LINES); for (int i = 0; i < m_LineCount - 1; ++i) { GL.Vertex(GetPoint(i)); GL.Vertex(GetPoint(i + 1)); } GL.End(); } 但是这个画线部

(转)unity使用line renderer画线

原文地址:http://www.xuanyusong.com/archives/561 任何一个无规则曲线它都是有若干个线段组成,及时是圆形它也是又若干个线段组成的,也就是说将若干个线段拼接起来就是我们须要的无规则曲线-那么在3D 的世界中我们须要知道 X Y Z 三个点来确定一条3D线段. 首先先使用Unity编辑器的方式来添加一条线- Unity -> GameObject -> Create Empty 创建一个空的对象,我命名为line.然后点击 Component -> Mis

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

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

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 Ma

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

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

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线

openCV 和GDI画线效率对照

一. 因为项目须要,原来用GDI做的画线的功能.新的项目中考虑到垮平台的问题.打算用openCV来实现.故此做个效率对照. 二. 2点做一条线,来測试效率. 用了相同的画板大小---256*256的大小,函数通过參数输入.用GetTickCount来实现计时功能. 三. GDI的主要循代码例如以下: void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* te

openCV 和GDI画线效率对比

一. 由于项目需要,原来用GDI做的画线的功能,新的项目中考虑到垮平台的问题,打算用openCV来实现,故此做个效率对比. 二. 2点做一条线,来测试效率. 用了同样的画板大小---256*256的大小,函数通过参数输入,用GetTickCount来实现计时功能. 三. GDI的主要循代码如下: void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* test

图形学中的画线算法之 &quot;DDA&quot;算法

DDA算法画直线,其理论依据:如 m 表示直线斜率, 那么有斜率 m  =  (y2 - y1) / (x2 - x1), ∴ m = Δy / Δx ,   从而有对于沿直线给定的 x 任何增量Δx,计算出对应的y的增量  Δy = m • Δx :  同理: Δx = Δy / m: 假设斜率  |m| <= 1:即 x 的长度大于  y的长度.现以 x 单位间距为增量,逐个计算  y 值, 有: yk+1 = yk + m; 同理,对于|m| > 1; 我们有: xK+1 = yK +