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();
        }
    }
    
    
  • 相关阅读:
    Picasa生成图片幻灯片页面图文教程
    Ubuntu下缓冲器溢出攻击实验(可以看看问题分析)
    redis源码笔记 aof
    redis源码笔记 bio
    redis源码笔记 slowlog
    记录一个字符数组和字符指针的不同
    redis源码笔记 rediscli.c
    redis源码笔记 redis对过期值的处理(in redis.c)
    redis源码笔记 有关LRU cache相关的代码
    redis源码笔记 initServer
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12315710.html
Copyright © 2011-2022 走看看