(二)GL 简单绘制

1.前言

GL简介中已经对GL方法的使用做了详细的说明,此文则是对GL方法的一些简单应用实例。

2.绘制简单图形

基本参数变量如下所示:

    public int circleCount = 6;
    public int circleRadius = 3; public int triangleSize = 2; public int quadSize = 2; 

2.1 绘制圆环

基于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(); } 

2.2 绘制三角形

绘制三角形平面

    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(); } 

2.3 绘制四边形

绘制四边形平面

    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.4 绘制圆形面

在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(); } 

2.5 绘制立方体

通过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(); } 

3.完整代码

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.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(); } 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(); } 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(); } } 

猜你喜欢

转载自www.cnblogs.com/llstart-new0201/p/12315710.html