.Net プラットフォームでの OpenGL 描画グラフィックス (1) (VS2019、Winform、C#)

1 はじめに

OpenGL (英語: Open Graphics Library、翻訳名: Open Graphics Library または「オープン グラフィックス ライブラリ」) は、2D および 3D ベクトル グラフィックスをレンダリングするためのクロス言語、クロスプラットフォームのアプリケーション プログラミング インターフェイス (API) です。このインターフェイスは、単純なグラフィックからより複雑な 3 次元シーンまで描画するために使用される、約 350 の異なる関数呼び出しで構成されています。さらに別のプログラム インターフェイス システムは、Microsoft Windows のみの Direct3D です。OpenGL は、CAD、仮想現実、科学的視覚化プログラム、ビデオ ゲーム開発で一般的に使用されています。
OpenGL の効率的な実装 (グラフィックス アクセラレーション ハードウェアを利用する) は、Windows、一部の UNIX プラットフォーム、および Mac OS 上に存在します。これらの実装は通常、表示デバイスの製造元によって提供され、製造元が提供するハードウェアに大きく依存します。オープン ソース ライブラリ Mesa は純粋なソフトウェア ベースのグラフィックス API であり、そのコードは OpenGL と互換性があります。ただし、ライセンス上の理由から、「非常によく似た」API であると主張しているだけです。
現在、OpenGL は、ビデオ業界で 2D/3D グラフィックスを処理するための API として最も広く受け入れられており、これに基づいて、コンピュータ ビジョン テクノロジの研究に使用するために、さまざまなコンピュータ プラットフォームやオンデバイス上でアプリケーション機能を生み出しています。多くのアプリケーションの。Windowsオペレーティングシステムやオペレーティングシステムプラットフォームに依存せず、さまざまな分野での開発やコンテンツ制作が可能であり、つまりPC、ワークステーション、スーパーコンピュータ、各種産業用コンピュータの実現を支援します。非常に高いビジュアル要件を備えた、高性能、高ビジュアルのグラフィックス処理ソフトウェア。

2. ツール

C# で OpenGL 関数を直接呼び出すのは面倒なので、通常は直接使用されません。SharpGL、CsGL、OpenTK、Tao フレームワークなどのサードパーティのオープンソース ライブラリを使用できます。以下、これらのフレームワークを一つずつ紹介していきますが、このうちTaoは保守・更新が停止しており、OpenTKで代替可能であるため、ここでは紹介しません。

3. Winform は立方体を描画します

VS2019、.NetFramework4.7

1. 空のソリューション プロジェクト OpenGLProjectApp を作成します

2. 生成されたプロジェクトを削除し、ソリューションを右クリックしてプロジェクトを追加し、Windows フォーム アプリケーションを選択します。プロジェクト名は SharpGLFormsApp1 です。

3.sharpgl 参照をプロジェクトに追加します

 

 プロジェクトが DLL を正常に参照していることがわかり、同時にツールボックスに追加のカテゴリが存在します。

 4. さまざまなコントロールをドラッグすると、ページ レイアウトは次の図のようになります。

 5. 各コントロールのイベントを書き込みます。焦点は openglcontrol の GDIDraw イベントにあります。完全なコードは次のとおりです。

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. 運用効果

 

おすすめ

転載: blog.csdn.net/hqwest/article/details/130655890