{
テクスチャは CPU 時間を大幅に節約できます。あはは、でもこのセクションにはかなりの時間がかかりました:(
OpenGL 補助ライブラリが使用されているため、現在このライブラリの機能を使用している人はほとんどいませんが、zdcnow (Magnetic Effect) のおかげで、この補助ライブラリの Delphi バージョンを提供してくれました。このセクションを学習する前に、glaux.dll および Glaux.pas ファイルをオンラインでダウンロードし、プロジェクトに追加してください。
さて、OPENGL の道を続けましょう。
このセクションではファイル操作を使用するため、まず SysUtils ユニットを追加する必要があります。また、Glaux ユニットも追加する必要があります。
次に、最初のレッスンに基づいて、いくつかの変数 xrot、yrot、zrot を追加します。これらの変数は、X、Y、Z 軸を中心にして立方体を回転するために使用されます。 texture[] は、テクスチャ用のストレージ スペースを割り当てます。複数のテクスチャが必要な場合は、数値 1 を必要な数値に変更する必要があります。
}
VAR
h_RC: HGLRC; // レンダリング コンテキスト (シェーディング記述テーブル)。
h_DC: HDC; // デバイスコンテキスト (デバイス記述テーブル)
h_Wnd: HWND;
h_Instance: HINST; // プログラムインスタンス(インスタンス)。
key : Array[0..255] Of Boolean // キーボード ルーチンの配列;
xrot, // X 回転量 (new)
yrot, // Y回転量(new)
zrot : GLfloat // Z回転量(new)
Texture : Array[0..1] Of Gluint // テクスチャを保存します (new)
{次に、opengl32.dll に 2 つのプロセスをロードします。これらを使用する必要があります}
プロシージャ glGenTextures(n: GLsizei; 変数テクスチャ: stdcall);
opengl32;
プロシージャ glBindTexture(ターゲット: GLenum; テクスチャ: stdcall);
opengl32;
{次に、画像を再入力するための新しい関数を追加する必要があります。この関数の戻り値の型は、Glaux.pas で次のように定義されています。
TAUX_RGBImageRec= レコード
サイズX、サイズY: GLint;
データ: ポインタ;
終わり;
PTAUX_RGBImageRec= ^TAUX_RGBImageRec;
具体的な意味は後ほど紹介します}
関数LoadBmp(ファイル名: pchar): PTAUX_RGBImageRec;
ヴァール
BitmapFile : // ファイルハンドル;
始める
//次にファイル名が指定されているかどうかを確認します
If Filename = '' then // ファイル名が指定されていることを確認してください。
result := Nil // 指定されない場合は、NULL を返します。
// 次に、ファイルが存在するかどうかを確認します。
BitmapFile := FileOpen(Filename, fmOpenWrite); // ファイルを開いてみる
// ファイルを開くことができれば、ファイルは明らかに存在します。
If BitmapFile > 0 then // ファイルは存在しますか?
始める
//ファイルを閉じます。
FileClose(BitmapFile); //ハンドルを閉じる
//auxDIBImageLoad(Filename) は画像データを読み取って返します。
result := auxDIBImageLoadA(filename); // ビットマップをロードし、ポインタを返します。
終わり
それ以外
// ファイルを開けない場合は NiL を返します。
result := Nil; // ロードが失敗した場合は NiL を返します。
終わり;
//次にテクスチャ マップをロードする新しい関数を作成します
関数LoadTexture: ブール値;
//ステータス変数。これを使用して、ビットマップをロードできるかどうか、およびテクスチャを作成できるかどうかを追跡します。
// ステータスはデフォルトで FALSE に設定されます (何もロードまたは作成されていないことを示します)。
//TextureImage変数PTAUX_RGBImageRec型にはビットマップの画像レコードが格納されます。
//このレコードには、ビットマップの幅、高さ、データが含まれます。
ヴァール
ステータス: ブール値。
TextureImage : PTAUX_RGBImageRec の Array[0..1];
始める
ステータス := false;
ZeroMemory(@TextureImage, sizeof(TextureImage)); // ポインタを NULL に設定します。
TextureImage[0] := LoadBMP('Texture.bmp');
TextureImage[0] <> Nil の場合
始める
ステータス := TRUE // ステータスを TRUE に設定します。
//次に、TextureImage[0] のデータを使用してテクスチャを作成します。
//glGenTextures(1, texture[0]) は OpenGL にテクスチャ名を生成したいことを伝えます
//(複数のテクスチャをロードしたい場合は、数を増やしてください)。
//glBindTexture(GL_TEXTURE_2D, texture[0]) は、テクスチャ名 texture[0] をテクスチャ ターゲットにバインドするように OpenGL に指示します。
//2D テクスチャには高さ (Y 軸上) と幅 (X 軸上) のみがあります。
//main関数はテクスチャデータにテクスチャ名を割り当てます。
//この例では、&texture[0] のメモリが利用可能であることを OpenGL に伝えます。
//作成したテクスチャは、&texture[0] が指すメモリ領域に保存されます。
glGenTextures(1, texture[0]); // テクスチャを作成します
glBindTexture(GL_TEXTURE_2D, texture[0]); //ビットマップデータから生成された一般的なテクスチャを使用します。
//実際のテクスチャを作成します。
//次の行は、このテクスチャが 2D テクスチャ (GL_TEXTURE_2D) であることを OpenGL に伝えます。
//数値ゼロは画像の詳細レベルを表し、通常はゼロのままです。
// 数字の 3 はデータのコンポーネントの数です。画像は赤データ、緑データ、青データの 3 つの要素で構成されているためです。
//TextureImage[0].sizeX はテクスチャの幅です。
//幅がわかっている場合は、ここに入力できますが、これはコンピュータが簡単に計算できます。
// TextureImage[0].sizey はテクスチャの高さです。
//数値ゼロは境界線の値で、通常はゼロです。
// GL_RGB は、画像データが赤、緑、青のカラー データで構成されていることを OpenGL に伝えます。
//GL_UNSIGNED_BYTE は、画像を構成するデータが符号なしバイト型であることを意味します。
//最後に... TextureImage[0].data が OpenGL にテクスチャ データのソースを伝えます。
//この例は、TextureImage[0] レコードに保存されているデータを指します。
// テクスチャを生成する
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
TextureImage[0].sizeY、0、GL_RGB、GL_UNSIGNED_BYTE、
テクスチャイメージ[0].data);
//次の 2 行は、画像を表示するときに OpenGL に指示します。
//拡大した元のテクスチャより大きい場合(GL_TEXTURE_MAG_FILTER)
// または、テクスチャが元のテクスチャよりも小さいサイズに縮小されるときに OpenGL によって使用されるフィルタリング方法 (GL_TEXTURE_MIN_FILTER)。
//通常はどちらの場合も GL_LINEAR を使用します。これにより、画面の遠くから近くまでテクスチャが滑らかに表示されます。
//GL_LINEAR を使用するには、CPU とグラフィックス カードがより多くの操作を実行する必要があります。
// マシンが遅い場合は、おそらく GL_NEAREST を使用する必要があります。
//フィルタリングされたテクスチャを拡大すると非常にモザイク状(モザイク状)に見えます。
//これら 2 つのフィルタリング方法を組み合わせることもできます。近い場合は GL_LINEAR を使用し、遠い場合は GL_NEAREST を使用します。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 線形フィルタリング
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 線形フィルタリング
終わり;
// 次に、ビットマップ データの保存に以前使用されていたメモリを解放します。
//まず、ビットマップ データが保存されているかどうかを確認します。
//そうであれば、データが保存されているかどうかを確認します。
//保存されている場合は削除します。
//次に、TextureImage[0] イメージ構造を解放して、すべてのメモリを確実に解放できるようにします。
If assign(TextureImage[0]) then // テクスチャが存在するかどうか
If assign(TextureImage[0].data) then // テクスチャ画像が存在するかどうか
TextureImage[0].data := Nil // テクスチャ画像が占有しているメモリを解放します。
TextureImage[0] := Nil // 画像構造を解放します。
//最後にステータス変数を返します。すべてが OK の場合、変数 Status の値は TRUE になります。それ以外の場合は FALSE
result := ステータス // ステータスを返します。
終わり;