GL

GL
http://blog.csdn.net/coffeecato/article/details/52671032
1、绘制2D图像的时需要使用GL.LoadOrtho()方法来将图形映射到平面中。

2、所有绘制相关的内容都要写在OnPostRender()方法中。

3、有关GL图像库的脚本需要绑定到Hierarchy视图中Camera上,否则无法显示绘制的图像。

4、在GL图像库的平面坐标系中,每个点的横坐标和纵坐标都应当是0与1之间的浮点数,而真实的像素坐标需要根据这个浮点数来计算

一、绘制线

别忘了添加物理材质public Material material;

复制代码

using

UnityEngine;

using

System.Collections;

///

///

GL 图像库

///

1、GL图像库是底层的图像库,主要功能是使用程序来绘制常见的2D与3D几何图形。这些图形

///

具有一定的特殊性,它们不属于3D网格图形,只会以面的形式渲染

///

///

2、绘制2D图像时,需要使用GL.LoadOrtho()方法来将图形映射在平面中,绘制的是3D图形,就无须使用此方法

///

///

3、使用GL图像库时,需要将所有绘制相关的内容写在OnPostRender()方法中

///

public

class

_7_5 : MonoBehaviour
{

///

///

绘制线段的材质

///

public

Material material;

private

void

OnPostRender()
{

if

(!

material)
{
Debug.Log(

"

请给材质资源赋值

"

);

return

;
}
material.SetPass(

0

);

//

设置该材质通道,0为默认值

    GL.LoadOrtho();

//

设置绘制2D图像

    GL.Begin(GL.LINES);

//

表示开始绘制,绘制类型为线段

    DrawLine(

0

,

0

,

200

,

100

);

//

绘制线段0

    DrawLine(

0

,

50

,

200

,

150

);

//

绘制线段1

    DrawLine(

0

,

100

,

200

,

200

);

//

绘制线段2

    GL.End();

//

结束绘制

}

private

void

DrawLine(

float

x1,

float

y1,

float

x2,

float

y2)
{

//

绘制线段,需要将屏幕中某个点的像素坐标除以屏幕宽或高

    GL.Vertex(

new

Vector3(x1 / Screen.width, y1 / Screen.height,

0

));

//

['vɜ:teks] n. 最高点;顶点;<数>(三角形、圆锥体等与底相对的)顶;

    GL.Vertex(

new

Vector3(x2 / Screen.width, y2 / Screen.height,

0

));
}

//

Use this for initialization

void

Start()
{

}

//

Update is called once per frame

void

Update()
{

}

}

复制代码

GL_第1张图片
image

二、绘制曲线

复制代码

using

UnityEngine;

using

System.Collections;

using

System.Collections.Generic;

///

///

绘制曲线

///

public

class

_7_5_1 : MonoBehaviour
{

///

///

绘制线段材质

///

public

Material material;

private

List

lineInfo;

//

Use this for initialization

void

Start()
{

//

初始化鼠标线段链表

    lineInfo = 

new

List

();
}

//

Update is called once per frame

void

Update()
{

//

将每次鼠标改变的位置存储进链表

lineInfo.Add(Input.mousePosition);
}

private

void

OnGUI()
{
GUILayout.Label(

"

当前鼠标x轴位置

"

Input.mousePosition.x);
GUILayout.Label(

"

当前鼠标y轴位置

"

Input.mousePosition.y);
}

private

void

OnPostRender()
{

if

(!

material)
{
Debug.LogError(

"

请给材质资源赋值

"

);

return

;
}
material.SetPass(

0

);

//

设置该材质通道,0为默认值

    GL.LoadOrtho();

//

设置绘制2D图像

    GL.Begin(GL.LINES);

//

表示开始绘制,绘制类型为线段

for

(

int

i =

0

; i < lineInfo.Count -

1

; i++

)
{
Vector3 start

=

lineInfo[i];
Vector3 end

= lineInfo[i +

1

];

//

绘制线段

DrawLine(start.x, start.y, end.x, end.y);
}
GL.End();
}

///

///

绘制线段

///

///

///

///

///

private

void

DrawLine(

float

x1,

float

y1,

float

x2,

float

y2)
{

//

绘制线段,需要将屏幕中某个点的像素坐标点除以屏幕宽或高

    GL.Vertex(

new

Vector3(x1 / Screen.width, y1 / Screen.height,

0

));

//

[ˈvɜ:ˌteks] 最高点;顶点

    GL.Vertex(

new

Vector3(x2 / Screen.width, y2 / Screen.height,

0

));
}
}

复制代码

GL_第2张图片
image

三、绘制四边形

绘制四边形,需要使用GL.Begin(GL.QUADS)方法

复制代码

using

UnityEngine;

using

System.Collections;

public

class

_7_5_3 : MonoBehaviour
{

///

///

可用材质0

///

public

Material material0;

///

///

可用材质1

///

public

Material material1;

///

///

可用材质2

///

public

Material material2;

private

void

OnPostRender()
{

//

绘制正四边形

    DrawRect(

100

,

100

,

100

,

100

, material0);
DrawRect(

250

,

100

,

100

,

100

, material1);

//

绘制无规则四边形

    DrawQuads(

15

,

5

,

10

,

115

,

95

,

110

,

90

,

10

, material2);
}

///

///

绘制正四边形

///

///

x轴起始坐标

///

y轴起始坐标

///

正四边形的宽

///

正四边形的高

///

private

void

DrawRect(

float

x,

float

y,

float

width,

float

height, Material material)
{
GL.PushMatrix();

//

[ˈmeɪtrɪks]n. <数>矩阵;模型;基质;母体,子宫

    material.SetPass(

0

);
GL.LoadOrtho();
GL.Begin(GL.QUADS);

//

绘制类型为四边形

    GL.Vertex3(x / Screen.width, y / Screen.height, 

0

);

//

['vɜ:teks] n. 最高点;顶点

    GL.Vertex3(x / Screen.width, (y + height) / Screen.height, 

0

);
GL.Vertex3((x

  • width) / Screen.width, (y + height) / Screen.height,

0

);
GL.Vertex3((x

  • width) / Screen.width, y / Screen.height,

0

);
GL.End();
GL.PopMatrix();
}

///

///

绘制无规则的四边形

///

///

起始点1的横坐标

///

起始点1的纵坐标

///

起始点2的横坐标

///

起始点2的纵坐标

///

起始点3的横坐标

///

起始点3的纵坐标

///

起始点4的横坐标

///

起始点4的纵坐标

///

material

private

void

DrawQuads(

float

x1,

float

y1,

float

x2,

float

y2,

float

x3,

float

y3,

float

x4,

float

y4, Material material)
{
GL.PushMatrix();
material.SetPass(

0

);
GL.LoadOrtho();
GL.Begin(GL.QUADS);

//

绘制类型为四边形

    GL.Vertex3(x1 / Screen.width, y1 / Screen.height, 

0

);
GL.Vertex3(x2

/ Screen.width, y2 / Screen.height,

0

);
GL.Vertex3(x3

/ Screen.width, y3 / Screen.height,

0

);
GL.Vertex3(x4

/ Screen.width, y4 / Screen.height,

0

);
GL.End();
GL.PopMatrix();
}

//

Use this for initialization

void

Start()
{

}

//

Update is called once per frame

void

Update()
{

}

}

复制代码

GL_第3张图片
image

四、绘制三角形

使用GL.Begin(GL.TRIANGLE)方法,

参数为三角形的类型

['traɪæŋɡl]n.

复制代码

using

UnityEngine;

using

System.Collections;

///

///

绘制三角形

///

使用GL.Vertex3()方法确定三角形三个顶点的位置,并将绘制三角形

///

的所有方法封装在DrawTriangle()方法中,最后使用GL.End()方法将三角形显示在屏幕中。

///

需要说明的是,在调用DrawTriangle()方法时,需要将三个点的坐标与材质传入该方法。

///

public

class

_7_5_4 : MonoBehaviour
{

///

///

材质

///

public

Material material;

private

void

OnPostRender()
{

//

绘制三角形

    DrawTriangle(

100

,

0

,

100

,

200

,

200

,

100

, material);
}

///

///

绘制三角形

///

Triangle n. 三角形;三人一组['traɪæŋɡl]

///

private

void

DrawTriangle(

float

x1,

float

y1,

float

x2,

float

y2,

float

x3,

float

y3, Material material)
{
material.SetPass(

0

);
GL.LoadOrtho();
GL.Begin(GL.TRIANGLES);

//

绘制三角形

    GL.Vertex3(x1 / Screen.width, y1 / Screen.height, 

0

);
GL.Vertex3(x2

/ Screen.width, y2 / Screen.height,

0

);
GL.Vertex3(x3

/ Screen.width, y3 / Screen.height,

0

);
GL.End();
}

//

Use this for initialization

void

Start()
{

}

//

Update is called once per frame

void

Update()
{

}

}

复制代码

GL_第4张图片
image

五、绘制3D几何图形

复制代码

using

UnityEngine;

using

System.Collections;

///

///

绘制 3D几何图形

///

public

class

_7_5_5 : MonoBehaviour
{

region

材质

public

Material material0;

public

Material material1;

public

Material material2;

endregion

private

void

OnPostRender()
{

//

绘制正四边形

    DrawRect(

100

,

100

,

100

,

100

, material0);
DrawRect(

250

,

100

,

100

,

100

, material1);

//

绘制无规则四边形

    DrawQuads(

15

,

5

,

10

,

115

,

95

,

110

,

90

,

10

, material2);
}

///

///

绘制正四边形

///

///

x轴起始坐标

///

y轴起始坐标

///

正四边形的宽

///

正四边形的高

///

material

private

void

DrawRect(

float

x,

float

y,

float

width,

float

height, Material material)
{
GL.PushMatrix();
material.SetPass(

0

);
GL.Begin(GL.QUADS);

//

四边形

    GL.Vertex3(x / Screen.width, y / Screen.height, 

0

);
GL.Vertex3(x

/ Screen.width, (y + height) / Screen.height,

0

);
GL.Vertex3((x

  • width) / Screen.width, (y + height) / Screen.height,

0

);
GL.Vertex3(x

/ Screen.width, (y + height) / Screen.height,

0

);
GL.End();
GL.PopMatrix();
}

///

///

绘制无规则四边形

///

///

起始点1的横坐标

///

起始点1的纵坐标

///

起始点2的横坐标

///

起始点2的纵坐标

///

起始点3的横坐标

///

起始点3的纵坐标

///

起始点4的横坐标

///

起始点4的纵坐标

///

material

private

void

DrawQuads(

float

x1,

float

y1,

float

x2,

float

y2,

float

x3,

float

y3,

float

x4,

float

y4,
Material material)
{
GL.PushMatrix();

//

[ˈmeɪtrɪks] n. <数>矩阵;模型;基质;母体,子宫

    material.SetPass(

0

);
GL.Begin(GL.QUADS);
GL.Vertex3(x1

/ Screen.width, y1 / Screen.height,

0

);
GL.Vertex3(x2

/ Screen.width, y2 / Screen.height,

0

);
GL.Vertex3(x3

/ Screen.width, y3 / Screen.height,

0

);
GL.Vertex3(x4

/ Screen.width, y4 / Screen.height,

0

);
GL.End();
GL.PopMatrix();
}

//

Use this for initialization

void

Start()
{

}

//

Update is called once per frame

void

Update()
{

}

}

复制代码

六、绘制线

任何一个模型都由若干网格面组成,而每一个面又由若干个三角形组成,也就是说,模型是由若干个三角形面组成的

复制代码

using

UnityEngine;

using

System.Collections;

public

class

_7_5_7 : MonoBehaviour
{

region

构成三角形1的三个顶点位置

Vector3 v0

=

new

Vector3(

5

,

0

,

0

);

Vector3 v1

=

new

Vector3(

0

,

5

,

0

);

Vector3 v2

=

new

Vector3(

0

,

0

,

5

);

endregion

//

构成三角形2的三个顶点位置

Vector3 v3 = 

new

Vector3(-

5

,

0

,

0

);
Vector3 v4

=

new

Vector3(

0

, -

5

,

0

);
Vector3 v5

=

new

Vector3(

0

,

0

, -

5

);

//

构成三角形1的贴图比例

Vector2 u0 = 

new

Vector2(

0

,

0

);
Vector2 u1

=

new

Vector2(

0

,

5

);
Vector2 u2

=

new

Vector2(

5

,

5

);

//

构成三角形2的贴图比例

Vector2 u3 = 

new

Vector2(

0

,

0

);
Vector2 u4

=

new

Vector2(

0

,

1

);
Vector2 u5

=

new

Vector2(

1

,

1

);

//

Use this for initialization

void

Start()
{

//

得到网格渲染器对象

    MeshFilter meshFilter = (MeshFilter)GameObject.Find(

"

face

"

).GetComponent(

typeof

(MeshFilter));
Mesh mesh

= meshFilter.mesh;

//

通过渲染器对象得到网格对象

    mesh.vertices = 

new

Vector3[] { v0, v1, v2, v3, v4, v5 };

//

n. 至高点,头顶;最高点( vertex的名词复数 );[ˈvə:tisi:z]

    mesh.uv = 

new

Vector2[] { v0, v1, v2, v3, v4, v5 };

//

设置三角形面上的贴图比例

    mesh.triangles = 

new

int

[] {

0

,

1

,

2

,

3

,

4

,

5

};

//

[t'raɪæŋɡlz] n. 三角形( triangle的名词复数 );

}

//

Update is called once per frame

void

Update()
{

}

}

你可能感兴趣的:(GL)