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