---- グラフィックスプログラム、特に 3 次元グラフィックスプログラムを開発する際、OpenGL は DirectX ほど複雑ではなく、感覚的には Delphi の方が C++ ほど複雑ではなく、より使いやすいと感じたため、DelphiOpenGL を選択しました。そこで、OpenGL が機能することを選択しました。その過程で(間違いなく)いくつかの問題に遭遇しましたが、友達とコミュニケーションが取れるようになることを願っています。
----まず初期化です。初期化中に、いくつかのタスクを実行する必要があります。 ① デバイス記述テーブル (デバイス コンテキスト) を作成します。 (注: DC に関しては、デバイス環境、デバイス説明テーブル、デバイス コンテキストなど、さまざまな資料の翻訳が異なりますが、あまり適切ではないようです。リー シャンランのような翻訳者がいれば素晴らしいと思います。)下記RCも同様です)②対応するピクセルフォーマット(PIXELFORMAT DESCRipTOR)を設定します。 ③描画記述テーブル(Rendering Context)を作成します。 Delphi でデバイス コンテキスト テーブルを取得または作成するには、いくつかの方法があります。最も簡単な方法は、次のように、キャンバス オブジェクト (TCanvas) のハンドル属性 (Handle) を直接取得することです。
DC: HDC; DC: = Canvas.Handle; API 関数 GetDC を使用してデバイス記述テーブルを取得することもできます。例: DC:=GetDC(ハンドル, DC);
---- 関数 CreateSupportedDC または BeginPaint..EndPaint (これらの違いに注意する必要があります) を使用して、デバイス記述テーブルを取得することもできます。ただし、デバイス記述テーブルを使い果たした後は、リソースを解放するために必ずテーブルを解放または削除する必要があります。デバイス コンテキスト テーブルにアクセスできるようになると、対応するピクセル形式を設定できます。ピクセル形式は、(少なくとも現時点では) ほとんど役に立たないフィールドを含むレコード タイプです。ピクセル形式の記述が完了したら、ChoosePixelFormat 関数と SetPixelFormat 関数を呼び出して、それをデバイス記述テーブルと照合して設定します。次のようなコードです。
関数 SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd); ppfd^.nVersion:=1;ppfd^.dwFlags: =PFD_DRAW_TO_WINDOW またはPFD_SUPPORT_OPENGL または PFD_DOUBLEBUFFER; ppfd^.dwLayerMask:=PFD_MAIN_PLANE; ppfd^.cColorBits:=8; ppfd^.cAccumBits:=0; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); if (nPixelformat=0) then begin MessageBox(NULL, 'choosePixelFormat failed', 'Error', MB_OK); 終了; ; if (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) then begin MessageBox(NULL, 'SetPixelFormat failed', 'Error', MB_OK); Exit Result:=True; end; pfd: PixelFormatDescriptor nPixelFormat : 整数; 開始FillChar(pfd,SizeOf(pfd),0); pfd では nSize:=sizeof(pfd); dwFlags:=PFD_SUPPORT_OPENGL または PFD_DRAW_TO_BITMAP または PFD_DOUBLEBUFFER; cColorBits:=32; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); nPixelFormat:=ChoosePixelFormat(DC,nPixelFormat,@pfd); DescribePixelFormat を使用してピクセル形式が正しく設定されているかどうかを確認します。 DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 then SetupPalette(DC,pfd);//SetupPalette はカスタム関数 }終了;
----上記の作業が完了したら、再度実行して nPixelFormat の値を確認することをお勧めします。通常、この値は 0 より大きくなければなりません。そうでない場合は問題が発生します。同じコードの場合、NT マシンでは 0 より大きい正しい値が得られますが、PWIN97 または 98 マシンでは正しい値が得られません。ただし、コンパイル時には問題なく、NT でコンパイルした後でも問題が発生する可能性があります。 PWIN97 マシンで使用されます。正しく実行されます。次に、シェーディング コンテキスト (RC) を作成します。次の例に示すように、関数 wglCreateContext および wglMakeCurrent を呼び出します。
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); プログラムが終了する前に、占有されているリソースを忘れずに解放してください。 wglMakeCurrent(0,0); RC< >null の場合は wglDeleteContext(RC); ghDC< >null の場合は ReleaseDC(Handle,DC);
---- 次のコードは、C++Builder 4 の OpenGL サンプルから改変されたものです。コンパイルされたプログラムのサイズは約 300K ですが、C++Builder 4 でのコンパイルされたプログラムのサイズは 384K です。
---- < a href="061403-05.zip ">プログラムコード Zip 3KB
---- プログラム内の OpenGL 関数とピクセル形式については、Delphi の MSHelp で詳しく説明されていますので、この記事ではあえて詳しく説明しません。