zoukankan      html  css  js  c++  java
  • (二)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();
        }
    }
    
    
  • 相关阅读:
    DP 水题 最长不下降子序列
    数的划分
    水题------纪念品分组
    NY95 众数问题
    NY86 找球号(一)
    C3-Zexal的矩阵链乘
    C3-Zexal的多路流水线调度
    C4-Zexal的食物链
    C4-排列
    C3-炮弹杀伤力
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12315710.html
Copyright © 2011-2022 走看看