1. 序文:
Delphi はデフォルトで OpenGL をサポートしています。OpenGL ユニットを使用してそれを参照すると、OpenGL 関数を使用できるようになります。 OpenGl はクロスプラットフォームであり、Windows では長い間 Opengl32.dll をサポートし、システムに統合されているため、追加のインストールは必要ありません。 Windows 自体に d3d はありますが、その機能は限られており、関連する学習教材のページは比較的少ないです。
通常、OpenGL は、点、線、および多角形の基本的な幾何学的形状のみをサポートします。基本的なグラフィックス要素として、サーフェスまたはより高レベルのグラフィックス (球など) を描画することはできません。しかし、それらはポリゴンを使用して完全にシミュレートできます。最近の 3D ゲームを何気なく見てみると、ほぼ完全に三角形で構築されていることがわかります。したがって、当社はこの制限には拘束されません。
2. 初期化
OpenGL を使用する前に、いくつかの関連パラメータを設定する必要があります。一般的なプロセスは次のとおりです。
「一致するピクセル形式を設定する」(ChoosePixelFormat、SetPixelFormat)
「新しい OpenGL レンダリング コンテキストを作成する」(wglCreateContext)
「OpenGL関連パラメータの設定」、「描画」(glBegin、glEnd)
「OpenGL レンダリング コンテキストの削除」(wglDeleteContext)
プロシージャ TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // サイズ nVersion := 1; // バージョン dwFlags := PFD_DRAW_TO_WINDOW PFD_DOUBLEBUFFER; // ダブルバッファリングをサポートします。 iPixelType := PFD_TYPE_RGBA; // カラー タイプ cColorBits := 0; // カラー ビット (無視されます) := 0; cBlueBits := 0; cAlphaBits := 0; cAlphaShift := 0; // アルファ バッファなし cAccumRedBits := 0; // 累積ビット (無視) = 0; cDepthBits := 16; // 深度バッファ cStencilBits := 0; // ステンシルバッファなし cAuxBuffers := 0; // 補助バッファなし bReserved := 0; dwDamageMask := 0; = GetDC(ハンドル); ChoosePixelFormat(FDC, @pfd); ピクセルフォーマット = 0 の場合は終了; SetPixelFormat(FDC, ピクセルフォーマット, @pfd) の場合は終了; FHRC := wglMakeCurrent(FDC, FHRC);黒パラメータは RGBA glClearColor(0, 0, 0, 0); //ビュー投影変換行列の正投影を設定します glMatrixMode(GL_PROJECTION) //現在指定されている行列を単位行列にリセットします glLoadIdentity; //この領域に描画する OpenGL を指定します glViewPort(0, 0, ClientWidth, ClientHeight);ワールド座標系の範囲を設定します gluOrtho2D(0, ClientWidth, ClientHeight, 0);行列変換オブジェクトをモデル ビュー変換に切り替える glMatrixMode(GL_MODELVIEW) //現在指定されている行列を恒等行列にリセットします glLoadIdentity;end;
3. 描画
OpenGL の基本プリミティブは、点、線、多角形などです。描画するたびに、glBegin() と glEnd() を使用する必要があります。たとえば、次の描画関数プロシージャ Draw;
process TForm1.Draw;begin // バッファをクリア glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT) // バッファをクリア glColor3ub(0, 255, 0) // OpenGL に三角形を描画するよう指示する glVertex2f(200, 300); ; //三角形の 3 つの頂点座標を OpenGL に送信します。 glVertex2f(300, 150); //プリミティブの描画を終了します。 SwapBuffers(FDC); // ダブル バッファの内容を交換し、画面に描画されたばかりのグラフィックスをコピーします。終わり;
4. 最後に、忘れずに を放してください。コード全体は次のとおりです。
ユニット Unit1; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、OpenGL を使用します。タイプ TForm1 = class(TForm) プロシージャ FormCreate(Sender: TObject) プロシージャ FormDestroy(Sender: TObject);送信者: TObject); プロシージャ FormResize(Sender: TObject); private { プライベート宣言 } FDC: HDC; FHRC: HGLRC; プロシージャ Draw; public { パブリック宣言 } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // バッファをクリアする glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT); glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//三角形が描画されることを OpenGL に伝える glVertex2f(200, 300) //三角形の 3 つの頂点座標を OpenGL に転送する glVertex2f(400, 300); glEnd; //絵元の描画を終了します。 SwapBuffers(FDC); // ダブル バッファの内容を交換し、画面に描画されたばかりのグラフィックスをコピーします。 end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR;pixelFormat:Integer;begin With begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // サイズ nVersion := 1; // バージョン dwFlags := PFD_SUPPORT_OPENGL PFD_DRAW_TO_WINDOW または PFD_DOUBLEBUFFER; // ダブルバッファリングをサポートします。 iPixelType := PFD_TYPE_RGBA; // カラー タイプ cRedBits := 0; // カラー ビット (無視されます) ; cGreenShift := 0; cBlueShift := 0; cAlphaShift := 0; // アルファ バッファなし cAccumBits := 0; // 累積ビット (無視) = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // ステンシル バッファなし cAuxBuffers := 0; // メイン レイヤー bReserved := 0; dwDamageMask := 0; ; FDC := GetDC(ハンドル); :=ChoosePixelFormat(FDC, @pfd); ピクセル形式 = 0 の場合は終了; SetPixelFormat(FDC, ピクセル形式, @pfd) の場合は終了します := wglMakeCurrent(FDC, FHRC);色は黒で、パラメータは RGBA glClearColor(0, 0, 0, 0); //ビュー投影変換行列を設定します glMatrixMode(GL_PROJECTION) //現在指定されている行列を単位行列にリセットします glLoadIdentity; //この領域に描画する OpenGL を指定します glViewPort(0, 0, ClientWidth, ClientHeight) ; //ワールド座標系の範囲を設定します gluOrtho2D(0, ClientWidth, ClientHeight, 0);行列変換オブジェクトをモデル ビュー変換に切り替えます。 glMatrixMode(GL_MODEELVIEW); //現在指定されている行列を恒等行列にリセットします。 glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC ); ReleaseDC(ハンドル、FDC);終了;プロシージャTForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //ウィンドウのサイズ変更時に描画領域を再指定 glClearColor(0, 0, 0, 0); ) ; glLoadIdentity(0, 0, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW);
完全なコードをダウンロードするにはここをクリックしてください