在GL简介中已经对GL方法的使用做了详细的说明,此文则是对GL方法的一些简单应用实例。
基本参数变量如下所示:
public int circleCount = 6;
public int circleRadius = 3;
public int triangleSize = 2;
public int quadSize = 2;
基于GL.LINES通过绘制线来生成圆。代码如下:
private void DrawCircle()
{
float angleDelta = 2 * Mathf.PI / circleCount;
GL.Begin(GL.LINES);
GL.Color(Color.red);
for (int i = 0; i < circleCount; i++)
{
float angle = angleDelta * i;
float angleNext = angle + angleDelta;
GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
}
GL.End();
}
绘制三角形平面
private void DrawTriangle()
{
GL.Begin(GL.TRIANGLES);
GL.Color(Color.green);
GL.Vertex3(-triangleSize, -triangleSize, 0);
GL.Color(Color.black);
GL.Vertex3(triangleSize, -triangleSize, 0);
GL.Color(Color.red);
GL.Vertex3(0, triangleSize, 0);
GL.End();
}
绘制四边形平面
private void DrawQuad()
{
GL.Begin(GL.QUADS);
GL.Color(Color.blue);
GL.Vertex3(-quadSize, -quadSize, 0);
GL.Vertex3(quadSize, -quadSize, 0);
GL.Vertex3(quadSize, quadSize, 0);
GL.Vertex3(-quadSize, quadSize, 0);
GL.End();
}
在2.1中通过线绘制圆形环,此节通过三角形绘制圆面
private void DrawCircleSurface()
{
float angleDelta = 2 * Mathf.PI / circleCount;
GL.Begin(GL.TRIANGLES);
GL.Color(Color.yellow);
for (int i = 0; i < circleCount; i++)
{
float angle = angleDelta * i;
float angleNext = angle + angleDelta;
GL.Vertex3(0, 0, 0);
GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
}
GL.End();
}
通过Quad绘制立方体
private void DrawCube()
{
GL.Begin(GL.QUADS);
GL.Color(Color.white);
GL.Vertex3(-quadSize, -quadSize, -quadSize);
GL.Vertex3(quadSize, -quadSize, -quadSize);
GL.Vertex3(quadSize, quadSize, -quadSize);
GL.Vertex3(-quadSize, quadSize, -quadSize);
GL.Vertex3(-quadSize, -quadSize, quadSize);
GL.Vertex3(quadSize, -quadSize, quadSize);
GL.Vertex3(quadSize, quadSize, quadSize);
GL.Vertex3(-quadSize, quadSize, quadSize);
GL.Vertex3(quadSize, -quadSize, -quadSize);
GL.Vertex3(quadSize, -quadSize, quadSize);
GL.Vertex3(quadSize, quadSize, quadSize);
GL.Vertex3(quadSize, quadSize, -quadSize);
GL.Vertex3(-quadSize, -quadSize, -quadSize);
GL.Vertex3(-quadSize, -quadSize, quadSize);
GL.Vertex3(-quadSize, quadSize, quadSize);
GL.Vertex3(-quadSize, quadSize, -quadSize);
GL.Vertex3(-quadSize, -quadSize, -quadSize);
GL.Vertex3(quadSize, -quadSize, quadSize);
GL.Vertex3(quadSize, -quadSize, quadSize);
GL.Vertex3(-quadSize, -quadSize, quadSize);
GL.Vertex3(-quadSize, quadSize, -quadSize);
GL.Vertex3(quadSize, quadSize, -quadSize);
GL.Vertex3(quadSize, quadSize, quadSize);
GL.Vertex3(-quadSize, quadSize, quadSize);
GL.End();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Graphics02GLDrawings : MonoBehaviour
{
public enum DrawingType
{
DRAW_CIRCLE,
DRAW_TRIANGLE,
DRAW_QUAD,
DRAW_CIRCLE_SURFACE,
DRAW_CUBE
}
public DrawingType type = DrawingType.DRAW_CIRCLE;
public int circleCount = 6;
public int circleRadius = 3;
public int triangleSize = 2;
public int quadSize = 2;
private Material glMat;
private void SetMaterialPass()
{
if (glMat == null)
{
glMat = new Material(Shader.Find("Hidden/Internal-Colored"));
}
glMat.SetPass(0);
}
private void OnRenderObject()
{
SetMaterialPass();
switch(type)
{
case DrawingType.DRAW_CIRCLE:
DrawCircle();
break;
case DrawingType.DRAW_TRIANGLE:
DrawTriangle();
break;
case DrawingType.DRAW_QUAD:
DrawQuad();
break;
case DrawingType.DRAW_CIRCLE_SURFACE:
DrawCircleSurface();
break;
case DrawingType.DRAW_CUBE:
DrawCube();
break;
}
}
private void DrawCircle()
{
float angleDelta = 2 * Mathf.PI / circleCount;
GL.Begin(GL.LINES);
GL.Color(Color.red);
for (int i = 0; i < circleCount; i++)
{
float angle = angleDelta * i;
float angleNext = angle + angleDelta;
GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
}
GL.End();
}
private void DrawTriangle()
{
GL.Begin(GL.TRIANGLES);
GL.Color(Color.green);
GL.Vertex3(-triangleSize, -triangleSize, 0);
GL.Color(Color.black);
GL.Vertex3(triangleSize, -triangleSize, 0);
GL.