1. 序文:
Delphi の場合、絵を描きたい場合はまず絵を加工する必要があり、Delphi に含まれていない他のユニットを参照する必要があるため、別途 Gl.pas をダウンロードする必要があります。インターネット上で一般的に見られる OpenGL ユニットはバージョン 1.0 でカプセル化されており、この関数は宣言されていません。 Gl.pas ユニットはオンラインで入手できます。さらに、補助ライブラリである Glaux.pas ユニットと glaux.dll が必要です。ダウンロードはこの記事の最後に記載されています。
2. 導入プロセス:
絵を描くには以下のような工程が必要です。 Window 独自の描画は png や jpg などのビットマップをベースにしており、描画する際は bmp に変換して描画することができます。
1. bmp 画像をロードします: auxDIBImageLoadA または他の関数を使用します。
2. テクスチャに変換: glGenTextures -> glBindTexture -> glTexImage2D、glTexParameteri は関連パラメータの設定に使用されます。
3. テクスチャを描画します: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. glDrawPixels関数を使用して描画します
glDrawPixels には次の 5 つのパラメータがあります。
width: テーブル画像の幅
高さ: テーブル画像の高さ
format: テーブルイメージのデータ保存形式
タイプ: 不明
ピクセル: DIB データへのポインタ
サンプルコードは次のとおりです。
プロシージャ TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; // バッファをクリアします glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT); / TBitmap の画像データは、逆の行順序でメモリに連続的に保存されます。最初のアドレス (画像バッファ アドレス) は、TBitmap.ScanLine[TBitmap.Height-1] // bmp 画像の色を介して取得できます。 bgr に保存されているため、パラメータとして GL_BGR_EXT を選択する必要があります。 glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]);
上記の方法ではテクスチャマッピングを有効にする必要はありません。glPixelZoom関数を使用すると、表示位置がウィンドウの左下になります(画像の変更方法がわかりません)。とりあえずの順位です。)
3. テクスチャ描画を使用する
画像の表示位置やズームを制御したい場合は、次の方法があります。
1. プロセスに従って、最初に画像をプログラムにロードし、関連する画像情報を取得します。
画像をテクスチャにロードするには、このサイトを参照してください:://www.VeVB.COm/article/52125.htm
Delphi でのビットマップのロードは非常に簡単で、次の方法でロードできます。
(1) 補助ライブラリの auxDIBImageLoadA 関数を使用して画像をロードします。戻り値は PTAUX_RGBImageRec データ ポインタで、DIB データ形式は RGB です。
// RGB データ構造 TAUX_RGBImageRec = レコード サイズ .bmp')); pを解放するにはどうすればよいですか? Dispose も Freemem もこのポインターの端を操作できません。
(2) TBitmap.LoadFromFile を通じて画像を読み込みます。 Delphi には効率の比較から、パフォーマンスは auxDIBImageLoadA と同じですが、DIB データ形式は BGR で、DIB ポインタは TBitmap.ScanLine[Bmp.Height - 1] です。
var Bmp: TBitmap;begin Bmp := TBitmap.Create; // 何かを行う // Bmp.Free;end;
2. Gl.pas に glGenTextures と glBindTexture を含むテクスチャを作成します。
// テクスチャ領域を作成します glGenTextures(1, @texture); // テクスチャ領域をバインドします glBindTexture(GL_TEXTURE_2D, texture) // ビットマップを使用して画像テクスチャを作成します glTexImage2D( GL_TEXTURE_2D, // テクスチャは 2D テクスチャです GL_TEXTURE_2D 0, // 画像の詳細レベルのデフォルトは 0 3, //データのコンポーネント数 画像は赤、緑、青で構成されているため、デフォルトは 3 Bmp.Width, // テクスチャの幅 Bmp.Height, // テクスチャの高さは 0, / / 境界線の値はデフォルトで 0 です。 GL_BGR_EXT, // データ形式 bmp は bgr GL_UNSIGNED_BYTE を使用します。 // 画像を構成するデータは符号なしバイト型 Bmp.ScanLine[Bmp.Height - 1] // DIB データです。ポインタ); //次の 2 行では、元のテクスチャを拡大するとき (GL_TEXTURE_MAG_FILTER)、または元のテクスチャを縮小するとき (GL_TEXTURE_MIN_FILTER) に OpenGL が使用するフィルタリング メソッドを opengl で使用できるようにします。 // GL_LINEAR は画像処理をスムーズにするために線形フィルタリングを使用しますが、より多くのメモリと CPU を必要とします glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) // 線形フィルタリング glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. テクスチャを描画する
テクスチャを描画する前に、テクスチャ マッピング glEnable(GL_TEXTURE_2D) を有効にするように OpenGL に通知する必要があります。オンにすると、非テクスチャ描画が機能しなくなります。使い終わったら忘れずに閉めてください。
// 以下は四角形を使用して描画します // glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D) // バッファをクリアします glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); := 10; w := 200;画像を 200*200 に拡大します。 // シーン内で複数のテクスチャが使用されている場合、テクスチャを glBegin() と glEnd() の間でバインドすることはできません。 glBegin(GL_QUADS); glTexCoord2f のパラメータの 1 つは X 座標です。 // 0.0 はテクスチャの左側です。 0.5 はテクスチャの中点、1.0 はテクスチャの右側です。 //glTexCoord2f の 2 番目のパラメータは Y 座標です。 // 0.0 はテクスチャの底部です。 0.5 はテクスチャの中点、1.0 はテクスチャの上部です。 glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(l + w, t + w); 0, 0); glVertex2f(l, t + w); glEnd();
上記の描画は完了です。以下は Draw の完全なコードです。補助ライブラリ Glaux.pas を参照する必要はありません。
プロシージャ TForm1.Draw;var Bmp: TBitmap; テクスチャ: Gluint; l, t, w: Integer;begin Bmp := Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); / テクスチャ領域を作成 glGenTextures(1, @texture); //テクスチャ領域をバインドします glBindTexture(GL_TEXTURE_2D, texture); // ビットマップを使用して画像テクスチャを作成します glTexImage2D( GL_TEXTURE_2D, // テクスチャは 2D テクスチャです GL_TEXTURE_2D 0, // 画像の詳細レベルのデフォルトは 0 3, / / データの成分数 画像は赤、緑、青で構成されているため、デフォルトは 3 Bmp.Width、 //テクスチャの幅 Bmp.Height, // テクスチャの高さは 0, // 境界線の値のデフォルトは 0 GL_BGR_EXT, // データ形式 bmp は bgr を使用します GL_UNSIGNED_BYTE, // 画像を構成するデータ符号なしバイト型 Bmp.ScanLine[Bmp .Height - 1] // DIB データ ポインター);次の 2 行では、元のテクスチャを拡大するとき (GL_TEXTURE_MAG_FILTER)、または元のテクスチャを縮小するとき (GL_TEXTURE_MIN_FILTER) に OpenGL が使用するフィルタリング メソッドを opengl で使用できるようにします。 // GL_LINEAR は画像処理をスムーズにするために線形フィルタリングを使用しますが、より多くのメモリと CPU を必要とします glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) // 線形フィルタリング glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 線形フィルタリング//以下は、四角形を使用して描画しています。 // テクスチャ マッピングを有効にする if glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D); // バッファをクリアします。 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); l := t :=; 10; w := 200;画像を 200*200 に拡大します。 // シーン内で複数のテクスチャが使用されている場合、テクスチャを glBegin() と glEnd() の間でバインドすることはできません。 glBegin(GL_QUADS); glTexCoord2f のパラメータの 1 つは X 座標です。 // 0.0 はテクスチャの左側です。 0.5 はテクスチャの中点、1.0 はテクスチャの右側です。 //glTexCoord2f の 2 番目のパラメータは Y 座標です。 // 0.0 はテクスチャの底部です。 0.5 はテクスチャの中点、1.0 はテクスチャの上部です。 glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(l + w, t + w); 0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Free(FDC);
この例の完全なコードはここからダウンロードできます。