Gráficos de dibujo OpenGL en la plataforma .Net (1) (VS2019, Winform, C#)

1. Introducción

OpenGL (inglés: Open Graphics Library, nombre traducido: Open Graphics Library o "Open Graphics Library") es una interfaz de programación de aplicaciones (API) multiplataforma y multilenguaje para renderizar gráficos vectoriales 2D y 3D. Esta interfaz consta de casi 350 llamadas a funciones diferentes, que se utilizan para dibujar desde gráficos simples hasta escenas tridimensionales más complejas. Otro sistema de interfaz de programa es Direct3D solo en Microsoft Windows. OpenGL se usa comúnmente en CAD, realidad virtual, programas de visualización científica y desarrollo de videojuegos.
Existen implementaciones eficientes de OpenGL (que aprovechan el hardware de aceleración de gráficos) en Windows, algunas plataformas UNIX y Mac OS. Estas implementaciones generalmente las proporcionan los fabricantes de dispositivos de visualización y dependen en gran medida del hardware proporcionado por el fabricante. La biblioteca de código abierto Mesa es una API de gráficos basada en software puro cuyo código es compatible con OpenGL. Sin embargo, por razones de licencia, solo afirma ser una API "muy similar".
Hoy en día, OpenGL es la API más aceptada para el procesamiento de gráficos 2D/3D en la industria del video. Sobre esta base, para ser utilizado en la investigación de la tecnología de visión por computadora, ha generado funciones de aplicación en varias plataformas informáticas y en dispositivos. de muchas aplicaciones. Es independiente del sistema operativo Windows y la plataforma del sistema operativo, y puede llevar a cabo el desarrollo y la creación de contenido en una variedad de campos diferentes. En resumen, ayuda a los desarrolladores a realizar PC, estaciones de trabajo, supercomputadoras y varias computadoras industriales. Realice el desarrollo de software de procesamiento de gráficos de alto rendimiento y alta calidad visual con requisitos visuales extremadamente altos.

2. Herramientas

Llamar a las funciones de OpenGL directamente en C# es engorroso y, por lo general, no se usa directamente. Podemos utilizar bibliotecas de código abierto de terceros, como SharpGL, CsGL, OpenTK, Tao framework, etc. A continuación, se presentan estos marcos uno por uno. Entre ellos, Tao ha dejado de mantener y actualizar, y puede ser reemplazado por OpenTK, por lo que no lo presentaré aquí.

3. Winform dibuja un cubo

VS2019, .NetFramework4.7

1. Cree un proyecto de solución vacío OpenGLProjectApp

2. Elimine el proyecto generado, haga clic con el botón derecho en la solución para agregar el proyecto, seleccione la aplicación de formulario de Windows y el nombre del proyecto es SharpGLFormsApp1

3. Agregue una referencia sharpgl al proyecto

 

 Se puede ver que el proyecto hace referencia al dll con éxito y, al mismo tiempo, hay una categoría adicional en la caja de herramientas.

 4. Arrastre diferentes controles, el diseño de la página es como se muestra en la figura:

 5. Escriba los eventos de cada control, el foco está en el evento GDIDraw de openglcontrol, código completo:

using SharpGL;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SharpGLFormsApp1
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 默认绘画模式为线条
        /// </summary>
        private uint _model = OpenGL.GL_LINE_LOOP;

        /// <summary>
        /// X轴坐标
        /// </summary>
        private float _x = 0;

        /// <summary>
        /// Y轴坐标
        /// </summary>
        private float _y = 0;

        /// <summary>
        /// Z轴坐标
        /// </summary>
        private float _z = 0;


        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 复位事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            _x = _y = _z = 0;
            tbX.Value = tbY.Value = tbZ.Value = Convert.ToInt32(_x);
            label1.Text = "X轴" ;
            label2.Text = "Y轴";
            label3.Text = "Z轴";
        }

        /// <summary>
        /// 线条选择事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rbline_CheckedChanged(object sender, EventArgs e)
        {
            _model = OpenGL.GL_LINE_LOOP;
        }

        /// <summary>
        /// 球面事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rbfull_CheckedChanged(object sender, EventArgs e)
        {
            _model = OpenGL.GL_QUADS;
        }

        /// <summary>
        /// 控件绘图事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void openGLControl1_GDIDraw(object sender, RenderEventArgs args)
        {
            // 创建一个GL对象
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;

            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);	// 清空屏幕
            gl.LoadIdentity();					// 重置
            gl.Translate(0.0f, 0.0f, -6.0f);	// 设置坐标,距离屏幕距离为6

            gl.Rotate(_x, 1.0f, 0.0f, 0.0f);	// 绕X轴旋转
            gl.Rotate(_y, 0.0f, 1.0f, 0.0f);	// 绕Y轴旋转
            gl.Rotate(_z, 0.0f, 0.0f, 1.0f);	// 绕Z轴旋转

            gl.Begin(_model);				    // 绘制立方体
            gl.Color(0.0f, 1.0f, 0.0f);			// 设置颜色
            //绘制其中一个面
            gl.Vertex(1.0f, 1.0f, -1.0f);
            gl.Vertex(-1.0f, 1.0f, -1.0f);
            gl.Vertex(-1.0f, 1.0f, 1.0f);
            gl.Vertex(1.0f, 1.0f, 1.0f);

            //如下类同
            gl.Color(1.0f, 0.5f, 0.0f);
            gl.Vertex(1.0f, -1.0f, 1.0f);
            gl.Vertex(-1.0f, -1.0f, 1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(1.0f, -1.0f, -1.0f);

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(1.0f, 1.0f, 1.0f);
            gl.Vertex(-1.0f, 1.0f, 1.0f);
            gl.Vertex(-1.0f, -1.0f, 1.0f);
            gl.Vertex(1.0f, -1.0f, 1.0f);

            gl.Color(1.0f, 1.0f, 0.0f);
            gl.Vertex(1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, 1.0f, -1.0f);
            gl.Vertex(1.0f, 1.0f, -1.0f);

            gl.Color(0.0f, 0.0f, 1.0f);
            gl.Vertex(-1.0f, 1.0f, 1.0f);
            gl.Vertex(-1.0f, 1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, 1.0f);

            gl.Color(1.0f, 0.0f, 1.0f);
            gl.Vertex(1.0f, 1.0f, -1.0f);
            gl.Vertex(1.0f, 1.0f, 1.0f);
            gl.Vertex(1.0f, -1.0f, 1.0f);
            gl.Vertex(1.0f, -1.0f, -1.0f);
            gl.End();						// 结束绘制
        }

        /// <summary>
        /// X轴拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbX_Scroll(object sender, EventArgs e)
        {
            int x = tbX.Value;
            _x = x;
            label1.Text = "X:" + x;
        }

        /// <summary>
        /// Y轴拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbY_Scroll(object sender, EventArgs e)
        {
            int y = tbY.Value;
            _y = y;
            label2.Text = "Y:" + y;
        }
        /// <summary>
        ///Z轴拖动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbZ_Scroll(object sender, EventArgs e)
        {
            int z = tbZ.Value;
            _z = z;
            label3.Text = "Z:" + z;
        }

      
    }
}

6. Efecto de operación

 

Supongo que te gusta

Origin blog.csdn.net/hqwest/article/details/130655890
Recomendado
Clasificación