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

posted @ 2020-02-16 09:01  81192  阅读(484)  评论(0编辑  收藏  举报