OPENGL グラフィックス プログラミング
OPENGL は、3 次元グラフィックスおよびモデル ライブラリです。その優れたパフォーマンスにより、現在、VC、DELPHI、C++Builder などの多くの高級言語が OPENGL とのインターフェイスを提供しています。 OPENGL を使用すると、ユーザーがグラフィックスや画像を開発する難しさが大幅に軽減され、ユーザーは高レベルの商業広告、グラフィック CAD、3 次元アニメーション、グラフィック シミュレーション、映画やテレビのコレクションを制作できるようになります。
1. OPENGLの機能
OPENGL は、もともとワークステーション上のグラフィック ソフトウェア ライブラリであり、商業、軍事、医療、航空宇宙などの分野で幅広く応用されているため、現在ではユーザーの要件を満たすグラフィックをローエンド コンピューターで開発できるようになりました。 OPENGL は基本的な画像を描画できるだけでなく、グラフィック画像を処理するための関数と手順を多数提供します。
1. グラフィックの変換
これは、グラフィック表示と制作の基礎です。グラフィック変換は、一般に、平行移動、回転、拡大縮小によって数学的に実現されます。グラフィックスの表示プロパティに応じて: 視点変換、モデル変換、投影変換、クリッピング変換、ビューポート変換など。
2.照明効果
非発光オブジェクトの色は、オブジェクトが照明である外光を反射することによって生じます。 3 次元グラフィックスでは、照明が不適切に使用されると、3 次元グラフィックスは本来の 3 次元感覚を失います。OPENGL は照明を放射光、周囲光、散乱光、反射光などに分類します。
3. テクスチャマッピング
テクスチャ マッピングを使用すると、現実世界のテクスチャを 3 次元サーフェスに追加できます。たとえば、長方形は現実世界のオブジェクトを表すことはできませんが、それが「本質的な」テクスチャで満たされている場合、それは現実的になります。
4. グラフィック特殊効果
ブレンディング機能、アンチエイリアス機能、フォグ機能は、3 次元グラフィックスの透明性と半透明性を処理し、オブジェクトを滑らかにし、線分を使用して滑らかにし、フォグ効果を提供します。
5. 画像の特殊効果
ビットマップを処理するための基本機能: 画像の描画、画像のコピーと保存、マッピングと転送、画像のスケーリングなど。ビットマップ演算機能により、原画の下位レベルで漢字の形成過程を説明することができます。
2.OPENGLアプリケーションの作成
1. 一般原則
A. OPENGL サポート ユニットを uses に追加します: OpenGL;
B フォームの OnCreate イベント中に OPENGL を初期化します。
C は、ウィンドウの OnPaing イベント中に OPENGL を初期化します。
D は、ウィンドウの OnResize イベント中に OPENGL を初期化します。
E は、ウィンドウの OnDestroy イベント中に OPENGL を初期化します。
2. 簡単な例
A プロジェクトファイルの作成 -> 新しいアプリケーション
B OnCreate イベントにコードを追加します。
PROcedure TfrmMain.FormCreate(送信者: TObject);
変数
pfd:TPixelFormatDescriptor // 説明テーブルを設定します。
ピクセル形式:整数;
始める
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
PDFで行う
始める
nSize:=sizeof(TPixelFormatDescriptor);
nバージョン:=1;
dwFlags:=PFD_DRAW_TO_WINDOW または
PFD_SUPPORT_OPENGL または PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
終わり;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=クライアント幅;
h:=クライアントの高さ;
終わり;
OnDestroy イベントの C コード
プロシージャ TfrmMain.FormDestroy(送信者: TObject);
始める
wglDeleteContext(hrc);
終わり;
OnPaint イベントの D コード
プロシージャ TfrmMain.FormPaint(送信者: TObject);
始める
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
マイドロー;
glフラッシュ;
SwapBuffers(Canvas.Handle);
終わり;
OnResize イベントの E コード
プロシージャ TfrmMain.FormResize(送信者: TObject);
始める
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
マイドロー;
終わり;
MyDraw 関数の F コード (ウィンドウ クラスでユーザーによって宣言)
プロシージャ TfrmMain.MyDraw;
始める
glPushMatrix;
Sphere:=gluNewQuadric;
gluQuadricDrawStyle(球,GLU_LINE);
gluSphere(球,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(球);
終わり;
このプログラムの元のコードを添付します。
ユニット MainFrm;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、OpenGL;
タイプ
TfrmMain = クラス(TForm)
プロシージャ FormCreate(Sender: TObject);
プロシージャ FormDestroy(Sender: TObject);
プロシージャ FormPaint(Sender: TObject);
プロシージャ FormResize(Sender: TObject);
プライベート
{プライベート宣言}
hrc:HGLRC;
w,h:glFloat;
球:GLUquadricObj;
公共
{公的宣言}
プロシージャ MyDraw;
終わり;
変数
frmMain: TfrmMain;
実装
{$R *.dfm}
プロシージャ TfrmMain.FormCreate(送信者: TObject);
変数
pfd:TPixelFormatDescriptor;
ピクセル形式:整数;
始める
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
PDFで行う
始める
nSize:=sizeof(TPixelFormatDescriptor);
nバージョン:=1;
dwFlags:=PFD_DRAW_TO_WINDOW または
PFD_SUPPORT_OPENGL または PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
終わり;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=クライアント幅;
h:=クライアントの高さ;
終わり;
プロシージャ TfrmMain.FormDestroy(送信者: TObject);
始める
wglDeleteContext(hrc);
終わり;
プロシージャ TfrmMain.FormPaint(送信者: TObject);
始める
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
マイドロー;
glフラッシュ;
SwapBuffers(Canvas.Handle);
終わり;
プロシージャ TfrmMain.MyDraw;
始める
glPushMatrix;
Sphere:=gluNewQuadric;
gluQuadricDrawStyle(球,GLU_LINE);
gluSphere(球,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(球);
終わり;
プロシージャ TfrmMain.FormResize(送信者: TObject);
始める
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
マイドロー;
終わり;
終わり。
3. OPENGL の変数と関数の規約
1. OPENGL ライブラリの規約
基本ライブラリー、実践ライブラリー、補助ライブラリーの合計3つのライブラリーがあります。 DELPHI では、基本ライブラリは OpenGL ユニットによって実装されます。Windows 環境では、補助ライブラリは通常使用されません。
2. OPENGL 定数規則
OPENGL 定数は、「GL」で始まる大文字を使用し、単語の区切りにはアンダースコアを使用します (例: GL_LINES)。これは、基本ライブラリを使用して直線を描画することを意味します。
3. OPENGL関数の命名規則
A 最初の部分は、glColor3f の gl のように、gl または wgl で始まります。
B 2 番目の部分は、単語の最初の文字を大文字にして英語で表現された関数です。
C の 3 番目の部分は、関数のパラメータを表す数値です。
D の 4 番目の部分は、関数の種類を示す小文字です。
b9ビット整数
s16ビット整数
i32ビット整数
f32 ビット浮動小数点数
d64 ビット浮動小数点数
ub9 ビット符号なし整数
例: glVertex2f(37,40); {パラメータとしての 2 つの 32 ビット浮動小数点数}
glVertex3d(37,40,5); {パラメータとしての 3 つの 64 ビット浮動小数点数}
p[1..3]:glFloat の配列;
glVertes3fv(p); {3f は 3 つの浮動小数点数を表し、v は頂点座標入力として配列を呼び出すことを表します}
4. OPENGLの初期化
1.Pixelformatdescriptor構造体
主に、ピクセルのカラー モードや赤、緑、青の色の構成など、ピクセルのプロパティについて説明します。
tagPIXELFORMATDESCRIPTOR = パックされたレコード
nサイズ: ワード;
nバージョン: Word;
dwFlags: DWORD;
iPixelType: バイト;
cColorBits: バイト;
cRedBits: バイト;
cRedShift: バイト;
cGreenBits: バイト;
cGreenShift: バイト;
cBlueBits: バイト;
cBlueShift: バイト;
cAlphaBits: バイト;
cAlphaShift: バイト;
cAccumBits: バイト;
cAccumRedBits: バイト;
cAccumGreenBits: バイト;
cAccumBlueBits: バイト;
cAccumAlphaBits: バイト;
cDepthBits: バイト;
cStencilBits: バイト;
cAuxBuffers: バイト;
iLayerType: バイト;
b予約済み: バイト。
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
終わり;
TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
dwFlags はポイント形式の属性を表します。
PFD_DRAW_TO_WINDOW グラフィックスは画面またはデバイスの表面に描画されます
PFD_DRAW_TO_BITMAP はメモリ内にビットマップを描画します
PFD_SUPPORT_GDI は GDI 描画をサポートします
PFD_SUPPORT_OPENGL は OPENGL 関数をサポートします
PFD_DOUBLEBUFFER はダブルバッファリングを使用します
PFD_STEREO ステレオ キャッシュ
PFD_NEED_PALLETTE は RGBA パレットを使用します
PFD_GENERIC_FORMAT は、GDI でサポートされる形式の描画を選択します
PFD_NEED_SYSTEM_PALETTE は、OPENGL でサポートされているハードウェア パレットを使用します
iPixelType は、ピクセル カラー モードを設定します: PFD_TYPE_RGBA または PFD_TYPE_INDEX。
cColorBits はカラー ビットを設定します。これが 9 の場合、ポイントの色を表す色が 256 色であることを意味します。
cRedBits、cGreenBits、cBlueBits RGBAを使用する場合、三原色に使用されるビット数。
cRedShitfs、cGreenShifts、cBlueShifts RGBAを使用する場合、三原色の調整可能な桁数。
cAlphaBits、cAlphaShifts RGBA を使用する場合、Alpha で使用されるビット数と調整可能なビット数。
cAccumBits は、累積バッファ領域の総ビット数を設定します。
cAccumRedBits、cAccumGreenBits、および cAccumBlueBits は、アキュムレーション バッファ領域内の 3 原色プレーンの合計数を設定します。
cAccumAlphaBits は、累積バッファ内のアルファ ビットの合計数を設定します。
cDepthBits は、濃度バッファーの深さを設定します。
cStencilBits は、ステンシル キャッシュの深さを設定します。
cAuxBuffers は、補助バッファーのサイズを指します。
iLayerType はレイヤーのタイプを指定します。
bReserved は使用されないため、ゼロにする必要があります。
dwLayerMask はオーバーレイのマスクを指定します。
dwDamageMask は、同じピクセル モードを同じフレーム キャッシュで共有するかどうかを設定します。
2. OPENGLの初期化手順
A Canvas.Handle を使用してウィンドウ ハンドルを取得します。
B TPixelFormatDescriptor 変数を作成してピクセル形式を定義します。
CChoosePixelFormat 関数を使用してピクセル形式を選択します。
D SetPixelFormat 関数を使用して、ピクセル形式を有効にします。
E wglCreateContext 関数を使用して、変換記述テーブルを作成します。
F wglMakeCurrent 関数を使用して、作成された変換記述テーブルを現在の変換記述テーブルとして使用します。
3. リソースの解放
A wglDeleteContext プロシージャを使用して、ピクセル コンテキスト テーブルを削除します。
B ReleaseDC プロシージャを使用してウィンドウ メモリを解放します。
ウィンドウの OnDestroy イベント:
始める
hrc<>null の場合
wglDeleteCurrent(hrc);
hdc<>null の場合
ReleaseDC(ハンドル,hdc);
終わり;
5. OPENGL基本グラフィックスの描画
1.グラフィックの色
背景色の設定に注意してください。色の設定は、通常、ピクセル記述変数、つまり TPixelFormatDescriptor 定義の iPixelType メンバーに関連しています。
iPixelType:=PFD_TYPE_COLORINDEX;
この場合、glIndexd、glIndexf、glIndexi、glIndexs、glIndexv、glIndexfv、glIndexiv、glIndexsv プロシージャのみを使用してグラフィックスの色を設定できます。
iPixelType:=PFD_TYPE_RGBA;
その場合、グラフィックスの色を設定するには、glColor3b、glColor3f、glColor4b、glColor4f、glColor4fv のみを使用できます。
グラフィックの背景色: 画面とウィンドウの色、つまりカラー バッファーの色。グラフィックスの背景色を変更するには、まず glClearColor プロシージャを使用して背景色を設定し、次に glClear プロシージャを使用してウィンドウと画面をこの背景色で更新する必要があります。
プロシージャ glClearColor(赤:GLClampf,緑:GLClampf,青:GLClampf,アルファ:GLClampf);
プロシージャ glClear(マスク:GLBitField);
赤、緑、青、アルファは設定する背景色で、値は0~1です。マスクは背景色を更新する方法です。
例: カラーリングウィンドウを緑色に設定する
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
マスクの値と意味:
GL_COLOR_BUFFER_BIT は現在のカラー バッファを設定します
GL_DEPTH_BUFFER_BIT は現在の深度バッファを設定します
GL_ACCUM_BUFFER_BIT は現在の蓄積バッファを設定します
GL_STENCIL_BUFFER_BIT は現在の STENCIL (テンプレート) バッファを設定します
描画ウィンドウはグレーに設定されています
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
Bグラフィックカラー
グラフィックスの描画色を設定するには、glClear3f、glClear4fを使用します。 3 つのパラメータを使用する場合は、赤、青、緑の 3 色の光をそれぞれ設定することを意味します。 4 つのパラメーターが使用される場合、4 番目のパラメーターは RGBA 値を表します。
現在の描画色を青に設定する例:
glColor3f(0,0,1);
プロットの色を白に設定します。
glColor3f(1,1,1);
2. 簡単なグラフィックの描画
glBegin プロシージャと glEnd プロシージャの間に、点、線、多角形などの単純なグラフィックスを描画します。
glBegin(mode:GLenum);{描画処理}glEnd;
モードの値:
GL_POINTS は複数の点を描画します
GL_LINES は複数の線を描画し、2 点ごとに直線を描画します
GL_LINE_STRIP はポリラインを描画します
GL_LINE_LOOP は端と端が接続された閉じたポリゴンを描画します
GL_TRIANGLES は三角形を描画します
GL_TRIANGLE_STRIP は、3 点ごとに三角形を描画します。
GL_TRIANGLE_FAN は三角形を描画します
GL_QUADS は四角形を描画します
GL_QUAD_STRIP は四角形のストリップを描画します。4 点ごとに 1 つの四角形のストリップが描画されます
GL_POLYGON はポリゴンを描画します
3 つの点を描画する例:
始める
glPushMatrix;
glBegin(GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0.5,0.5);
glVertex2f(0.1,0.3);
glEnd;
SwapBuffers(Canvas.Handle);
終わり;
GL_POINTをGL_LINESに変更すると、3番目の点は無効になります。 glVertex2fの前にglColor3f(0,0,1)を実行すると、GL_LINESをGL_LINE_STRIPに変更すると、線を描画できます。 2 直線。
ポイント サイズを設定するには glPointSize プロシージャを使用し、線の幅を設定するには glLineWidth プロシージャを使用します。
glLineStipple プロシージャを使用して点線のテンプレートを設定し、glEnable(GL_LINE_STIPPLE) プロシージャと対応するパラメータを使用して点線の描画を有効にし、glDisable(GL_LINE_STIPPLE) プロシージャと対応するパラメータを使用して点線をオフにします。
プロシージャ glLineStipple(factor:GLint,pattern:GLushort);
パラメータ係数は、一点鎖線テンプレート パターンの繰り返し数を表します。係数の値は 1255 です。パターンはバイナリ シーケンスです。
glLineStipple(1,0,0x11C);{0x11C は 10001110 として表され、0 は点を描画しないことを意味し、1 は点を描画することを意味します}
例: 開始
glColor3f(1,0,0);
glLineWidth(2);
glLineStipple(1,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glEnd;
glDisable(GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
glEnd;
glDisable(GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
終わり;
ポリゴン描画は点線描画と同様に、パラメータを GL_POLYGON、GL_QUADS、GL_TRANGLES に変更する必要があります。
多角形の辺は頂点でのみ交差します
B 多角形は凸多角形でなければなりません。凹多角形の場合、ユーザーは描画を高速化するためにそれを凸多角形に折りたたむことしかできません。
例: glBegin(GL_POLYGON);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glVertex2f(0.9,-0.6);
glVertex2f(0.5,-0.6);
glVertex2f(-0.9,-0.2);
glEnd;
ポリゴンには表と裏があり、それに関わる処理は次のとおりです。
glPolygonMode は、ポリゴンの前面および背面の描画モードを制御します。
glFrontface はポリゴンの前面を指定します
glCullFace は、面を削除するように設定されたポリゴンを表示します
glPolygonStripple はポリゴン塗りつぶしのスタイルを形成します
3. 単純な二次曲面
円柱、リング、球はすべて二次曲面です。
シリンダー
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
スライス:GLint、スタック:GLint);
qobj は二次曲面を指定します。baseRadius は描画された円柱の上部の半径です。height は Z 軸の周りの分割線の数です。 Z 軸に沿った分割線。
baseRadius と topRadius が等しくない場合は、錐台と円錐を描画できます。
プロシージャ TfrmMain.MyDraw;
変数
qObj:GLUQuadricObj;
始める
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
終わり;
持ってくる
gluDisk(qobj:GLUquadricObj、innerRadius:GLdouble、outerRadius:GLdouble、スライス:GLint、
ループ:GLint);
プロシージャ TfrmMain.MyDraw;
変数
qObj:GLUQuadricObj;
始める
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
終わり;
C 半円
gluPartialDisk(qobj:GLUquadricObj、innerRadius:GLdouble、outerRadius:GLdouble、スライス:GLint、
ループ:GLint、開始角度:GLdouble、スイープ角度:GLdouble);
startAngle、sweeepAngle は、半円の開始角度と終了角度です。
プロシージャ TfrmMain.MyDraw;
変数
qObj:GLUQuadricObj;
始める
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
終わり;
Dスフィア
function gluSphere(qObj:GLUquadricObj、半径:GLdouble、スライス:GLint、スタック:GLint);
プロシージャ TfrmMain.MyDraw;
変数
qObj:GLUQuadricObj;
始める
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
{ シルエット[ silu(:)5et ]n. シルエット、アウトライン}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
終わり;
E 二次曲面の処理について
gluNewQuadric は新しい二次曲面オブジェクトを作成します
gluDeleteQuadric は二次曲面オブジェクトを削除します
gluQuadricDrawStyle は描画する二次曲面のタイプを指定します
gluQuadricNormal は 2 次曲面の法線ベクトルを設定します
gluQuadricOrientation は、二次曲面が内部回転されるか外部回転されるかを設定します。
gluQuadricTexture は、二次曲面がテクスチャを使用するかどうかを設定します
F 二次曲面を描画するための一般的な手順
まず、GLUquadricObj オブジェクトを定義します。
次に、サーフェス オブジェクト gluNewQuadric を作成します。
二次曲面のプロパティを再度設定します (gluQuadricDrawStyle、gluQuadricTexture)
二次曲面の描画 (gluCylinder、gluSphere、gluDisk、gluPartialDisk)
6. OPENGL での変換
変換は、グラフィックの変換、回転、スケーリング、その他の操作を含むアニメーション デザインの基礎であり、行列を通じて数学的に実装されます。
1 glLoadIdentity プロセス
現在の行列を単位行列に変換できます。
2 glLoadMatrix プロセス
指定した行列を現在の行列として設定できます。
プロシージャ glLoadmatrixd(m:GLdouble);
プロシージャ glLoadmatrixf(m:GLfloat);
m は 4X4 行列を表し、次のコードはそれを定義して現在の行列にします。
M: GLfloat の配列[1..4,1..4];
glLoadMatrix(@M);
3 glMultMatrix プロセス
現在の瞬間に指定された行列を乗算し、その結果を現在の瞬間として使用できます。
プロシージャ glMultMatrixd(M:GLdouble);
プロシージャ glMultMatrixf(M:GLfloat);
4 glPushMatrix と glPopmatrix
glPushMatrix は現在の瞬間を行列スタックにプッシュでき、glPopMatrix は現在の瞬間を行列スタックからポップできます。
glPushMatrix は行列の現在位置を記憶し、glPopmatrix は前の位置を返すことができます。
注: glPushMatrix と glPopMatrix は、glBegin と glEnd の外側に配置する必要があります。
5 射影変換
glOrtho は、正投影行列を作成し、現在のモーメントに正投影行列を乗算し、その結果を現在の行列として使用できます。
関数 glOrtho(左:GLdouble,右:GLdouble,下:GLdouble,上:GLdouble,
近く:GLdouble、遠く:GLdouble);
プロシージャ TfrmMain.FormResize(送信者: TObject);
変数
nRange:GLfloat;
始める
nRange:=50.0;
w:=クライアント幅;
h:=クライアントの高さ;
h=0 の場合
h:=1;
glViewPort(0,0,w,h);
w<=h の場合
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-n範囲,n範囲)
それ以外
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
再塗装;
終わり;
B glOrtho2D は、正投影ビュー ボリュームの前後左右のみを定義します。
プロシージャ glOrtho(左:GLdouble,右:GLdouble,下:GLdouble,上:GLdouble);
C glMatrixMode プロシージャ
現在の演算マトリックスのタイプを設定する機能
プロシージャ glMatrixMode(mode:GLenum);
モードの値:
GL_MODELVIEW は、後続の行列演算がモデル行列スタックであることを指定します
GL_PROJECTION は、後続の行列演算が射影行列スタックであることを指定します
GL_TEXTURE は、後続のマトリックス演算がテクスチャ マトリックス スタックであることを指定します。
D gl錐台プロセス
透視斜射影行列を作成し、現在の行列に斜射影行列を乗算します。その結果が現在の行列になります。
プロシージャ glFrustum(左:GLdouble,右:GLdouble,下:GLdouble,上:GLdouble,
次:GLdouble、遠い:GLdouble);
これらのパラメータは、斜投影の左、右、上、下、前、後ろのクリッピング プレーンを定義します。
gluPerspective プロセス
Z 軸を中心線として、四角錐の表示ボリュームを定義できます。
プロシージャ gluPerspetive(fovy:GLdouble,aspect:GLdouble,zNear:GLdouble,zFar:GLdouble);
fovy は xoz 平面の遠近感を定義し、aspect は x 方向と y 方向の比率を定義し、zNear と zFar は視点からクリッピング プレーンとバック クリッピング プレーンまでの距離をそれぞれ定義します。
プロシージャ TfrmMain.FormResize(送信者: TObject);
変数
アスペクト:GLfloat;
始める
w:=クライアント幅;
h:=クライアントの高さ;
h=0 の場合
h:=1;
glViewPort(0,0,clientWidth,Clientheight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
アスペクト:=w/h;
gluPerspective(30.0,アスペクト,1.0,50.0);
glMatrixMode(GL_MODEELVIEW);
glLoadIdentity;
終わり;
6 幾何変換行列
3次元オブジェクトの移動姿勢変換とは、オブジェクトの平行移動、回転、拡大縮小を指します。
glTranslate プロセスは、座標原点を (x, y, z) に移動できます。その宣言構文は次のとおりです。
プロシージャ glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
プロシージャ glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
B glRotate はオブジェクトを特定の角度に回転できます。その宣言構文は次のとおりです。
プロシージャ glRotated(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
プロシージャ glRotatef(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
このうち、angleは回転角度であり、回転の中心軸は2点(0,0,0)と(x,y,z)を結んだ線となります。
C glScale は座標系をスケールできます。その宣言構文は次のとおりです。
プロシージャ glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
プロシージャ glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
x、y、z の値が 1 より大きい場合は拡大を表し、1 より小さい場合は縮小を表します。
元のコードの例:
ユニット MainFrm;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、OpenGL、ExtCtrls;
タイプ
TfrmMain = クラス(TForm)
タイマー 1: T タイマー;
プロシージャ FormCreate(Sender: TObject);
プロシージャ FormDestroy(Sender: TObject);
プロシージャ FormPaint(Sender: TObject);
プロシージャ FormKeyDown(送信者: TObject; var Key: Word;
シフト: TShiftState);
プロシージャ FormResize(Sender: TObject);
プロシージャ Timer1Timer(送信者: TObject);
プロシージャ FormClose(Sender: TObject; var Action: TCloseAction);
プライベート
{プライベート宣言}
hrc:HGLRC;
w、h:整数;
緯度、経度:GLfloat;
半径:GLdouble;
公共
{公的宣言}
プロシージャ MyDraw;
プロシージャ InitializeGL(var width:GLsizei;height:GLsizei);
終わり;
変数
frmMain: TfrmMain;
実装
{$R *.dfm}
プロシージャ TfrmMain.FormCreate(送信者: TObject);
変数
pfd:TPixelFormatDescriptor;
ピクセル形式:整数;
始める
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
PDFで行う
始める
nSize:=sizeof(TPixelFormatDescriptor);
nバージョン:=1;
dwFlags:=PFD_DRAW_TO_WINDOW または
PFD_SUPPORT_OPENGL または PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
終わり;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientRect.Right;
h:=ClientRect.Bottom;
InitializeGL(w,h);
終わり;
プロシージャ TfrmMain.FormDestroy(送信者: TObject);
始める
wglDeleteContext(hrc);
終わり;
プロシージャ TfrmMain.FormPaint(送信者: TObject);
始める
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
マイドロー;
glフラッシュ;
終わり;
プロシージャ TfrmMain.MyDraw;
変数
qObj:GLUQuadricObj;
始める
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT または GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glRotated(0.5,0.0,1.0,0.0);
glRotated(-緯度,1.0,0.0,0.0);
glotated(経度,0.0,0.0,1.0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
終わり;
{プロシージャ TfrmMain.FormResize(送信者: TObject);
変数
nRange:GLfloat;
始める
nRange:=50.0;
w:=クライアント幅;
h:=クライアントの高さ;
h=0 の場合
h:=1;
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
w<=h の場合
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-n範囲,n範囲)
それ以外
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
glMatrixMode(GL_MODEELVIEW);
glLoadidentity;
再塗装;
終わり;
}
プロシージャ TfrmMain.FormKeyDown(送信者: TObject; var Key: Word;
シフト: TShiftState);
始める
Key=VK_ESCAPEの場合
近い;
Key=VK_UP の場合
glRotatef(-5,1.0,0.0,0.0);
Key=VK_DOWN の場合
glRotatef(5,1.0,0.0,0.0);
Key=VK_LEFT の場合
glRotatef(-5,0.0,1.0,0.0);
Key=VK_RIGHT の場合
glRotatef(5.0,0.0,1.0,0.0);
再塗装する。
終わり;
プロシージャ TfrmMain.FormResize(送信者: TObject);
始める
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,clientWidth,clientHeight);
再塗装する。
無効化する。
終わり;
プロシージャ TfrmMain.InitializeGL(var width: GLsizei; height: GLsizei);
変数
maxObjectSize、アスペクト:GLfloat;
ニアプレーン:GLdouble;
始める
glClearindex(0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
アスペクト:=1.0;
gluPerspective(45.0,アスペクト,3.0,7.0);
glmatrixMode(GL_MODEELVIEW);
ニアプレーン:=0.3;
maxObjectSize:=0.3;
radius:=near_plane+maxObjectSize/2.0;
緯度:=0.3;
経度:=0.6;
終わり;
プロシージャ TfrmMain.Timer1Timer(送信者: TObject);
始める
timer1.Enabled:=false;
マイドロー;
収率;
Timer1.Enabled:=true;
終わり;
プロシージャ TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
始める
timer1.Enabled:=false;
hrc<>null の場合
wglDeleteContext(hrc);
終わり;
終わり。
7. OPENGLのライティングとテクスチャ
これらはすべて、立体感と色彩効果を高めるための手段であり、照明はグラフィックスの明るさと立体感を高めることができ、テクスチャはグラフィックスをよりリアルにすることができます。照明によって物体の表情を強く表現したり、テクスチャによって物体に様々な表情を持たせることができます。
1 照明および光源のプロセスとアプリケーション
glIndex プロシージャは、カラー インデックス テーブル内の色を現在の色にします。
プロシージャ glIndexd(c:GLdouble);
プロシージャ glIndexf(c:GLdouble);
プロシージャ glIndexi(c:GLdouble);
プロシージャ glIndexs(c:GLdouble);
パラメータ C はインデックス値です。glIndex プロシージャが使用される場合、TPiexlFormatDescriptor 構造体の iPixelType メンバは PFD_TYPE_COLORINDEX に設定されます。
B glShadeModel プロシージャ
glShadeModel プロセスは、塗りつぶしモード、値 GL_SMOOTH を設定します。
プロシージャ glShadeModel(mode:GLenum);
注: 上記 2 つのプロセスは、glBegin....glEnd の外部でのみ使用できます。
C glLight プロシージャは光源を定義します
プロシージャ glLightf(light:GLenum,pname:GLenum,param:GLfloat);
プロシージャ glLighti(light:GLenum,pname:GLenum,param:GLfloat);
パラメータ light は光源を定義します。その値は次のとおりです: GL_LIGHT0....GL_LIGHTN、N 値は GL_MAX_LIGHT 未満です。
パラメータ pname は光源パラメータを指定します。
GL_AMBIENT 環境光の成分強度
GL_DIFFUSE 散乱光成分の強度
GL_SPECULAR 反射光の成分強度
GL_POSITION 光源の位置
GL_SPOT_DIRECTION 光源の焦点方向
GL_SPOT_EXPONENT 光源インデックス
GL_SPOT_CUTOFF 光源方向
GL_CONSTANT_ATTENUATION 光定数減衰係数
GL_LINEAR_ATTENUATION 光の二次減衰係数
glEnable() および glDisable() プロシージャを使用して光源を有効またはオフにする
glEnable(GL_LIGHTING); //光源を有効にする
glDisable(GL_LIGHTING); //光源をオフにする
glEnable(GL_LIGHT0); //0番目の光源を有効にする
glDisable(GL_LIGHT0); //0番目の光源をオフにする
光源の設定例:
変数
sdirection:配列[1..4] GLfloat:={0.0,1.0,0.0,0.0};
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,sdirection);
2 マテリアルと照明モデル
glマテリアル プロシージャはマテリアル パラメータを設定します
プロシージャ glmaterialf(face:GLenum,pname:GLenum,param:GLfloat);
プロシージャ glMateriali(face:GLenum,pname:GLenum,param:GLfloat);
プロシージャ glmaterialfv(face:GLenum,pname:GLenum,param:GLfloat);
プロシージャ glMaterialiv(face:GLenum,pname:GLenum,param:GLfloat);
パラメータ face はオブジェクトの表面を指定し、その値は GL_FRONT、GL_BACK、GL_FRONT_BACK です。
pname、param はこの資料では紹介されていません。
B glLightModel プロセス
プロシージャ glLightModelf(pname:GLenum,param:GLfloat);
パラメータ pname は光源モデル パラメータであり、GL_LIGHT_MODEL_AMBIENT の値を取ることができます。
GL_LIGHT_MODEL_LOCAL_VIEWER、GL_LIGHT_MODEL_TWO_SIDE。
コード例:
プロシージャ TfrmMain.SetLighting;
変数
MaterialAmbient:GLfloat の配列 [1..4];
MaterialDiffuse:GLfloat の Array[1..4];
MaterialSpecular:GLfloat の Array[1..4]。
AmbientLightPosition:GLfloat の Array[1..4];
LightAmbient:GLfloat の Array[1..4];
素材光沢:GLfloat;
始める
マテリアルアンビエント[1]:=0.5;
マテリアルアンビエント[2]:=0.8;
マテリアルアンビエント[1]:=0.2;
マテリアルアンビエント[1]:=1.0;
マテリアル拡散[1]:=0.4;
マテリアル拡散[2]:=0.8;
マテリアル拡散[3]:=0.1;
マテリアル拡散[4]:=1.0;
マテリアルスペキュラー[1]:=1.0;
マテリアルスペキュラー[2]:=0.5;
マテリアルスペキュラー[3]:=0.1;
マテリアルスペキュラー[4]:=1.0;
素材光沢度:=50.0;
アンビエントライト位置[1]:=0.5;
アンビエントライト位置[2]:=1.0;
アンビエントライト位置[3]:=1.0;
アンビエントライト位置[4]:=0.0;
ライトアンビエント[1]:=0.5;
ライトアンビエント[2]:=0.2;
ライトアンビエント[3]:=0.8;
ライトアンビエント[4]:=1.0;
glMaterialfv(GL_FRONT,GL_AMBIENT,@マテリアルアンビエント);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
glMaterialfv(GL_FRONT,GL_SHININES,@MaterialShininess);
glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLShadeModel(GL_SMOOTH);
終わり;
3 テクスチャの適用
glTexImage1D は 1 次元のテクスチャ マップを定義します。
プロシージャ glTexImage1D(ターゲット:GLenum、レベル:GLint、コンポーネント:GLint、幅:GLsizei、
ボーダー:GLint、フォーマット:GLenum、タイプ:GLenum、ピクセル:GLvoid);
パラメータのターゲット値は GL_TEXTURE_1D で、これはテクスチャ マッピングとして定義されます。level はマルチレベル解像度のテクスチャ イメージのレベル、width はテクスチャの幅、値は 2n、n の値は 32、64、129 です。 Border はテクスチャの境界であり、その値は 0 または 1 です。Pixel はメモリ内のテクスチャの位置であり、RGBA の混合と調整を指定します。
1B食材を選択
2食材BとAを選ぶ
3R・G・B成分を選択
4R、G、B、A成分を選択
B glTexImage2D は 2 次元テクスチャ マッピングを定義します
プロシージャ glTexImage2D(ターゲット:GLenum、レベル:GLint、コンポーネント:GLint、幅:GLsizei、
ボーダー:GLint、フォーマット:GLenum、タイプ:GLenum、ピクセル:GLvoid);
パラメータ対象が GL_TEXTURE_2D の場合、意味は 2 次元テクスチャ マッピング、高さはテクスチャの高さ、関数内のその他のパラメータは glTexImage1D と同じです。コンポーネント パラメータの値は上記と同じです。
コード例:
プロシージャTfrmMain.SetTextures;
変数
ビット:GLubyte の配列[1..64,1..64,1..64];
bmp:TBitmap;
i,j:整数;
始める
bmp:=TBitmap.Create;
bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
for i:=1 ~ 64 を実行します
for j:=1 ~ 64 を実行します
始める
bits[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
ビット[i,j,4]:=255;
終わり;
{0 は単一のカラー シェーディング レベルを表し、GL_RGBA は混合値を表します
64X64 はテクスチャの高さと幅を表し、0 は境界なしを表します。
GL_RGBA はテクスチャ タイプを表し、GL_UNSIGNED_TYPE はデータ タイプを表し、@世代オブジェクト アドレス}
glteximage2d(gl_texture_2d、0、gl_rgba、64,64,0、gl_rgba、
gl_unsigned_byte、@bits);
Glenable(gl_texture_2d);
終わり;
c gltexparameterプロシージャテクスチャパラメーターを設定します
手順GLTEXPARAMETERF(ターゲット:Glenum、PName:Glenum、Param:Glfloat);
手順GLTEXPARAMETERI(ターゲット:Glenum、PName:Glenum、Param:Glfloat);
パラメーターターゲットは、gl_texture_1dまたはgl_texture_2dを表し、paramはテクスチャ値です。
d gltexenv関数テクスチャの環境パラメーターを設定します
関数gltexenvf(ターゲット:Glenum、pname:Glenum、param:glfloat);
関数gltexenvi(ターゲット:グレナム、pname:glenum、param:glfloat);
パラメーターターゲットはgl_texture_envです。
パラメーターpnameはテクスチャパラメーター値であり、値はgl_texture_env_modeです
パラメーターPARAMは環境値であり、その値はGL_Modulate、GL_DECAL、およびGL_BLENDです。
このプログラムのサンプルコード:
ユニットmainfrm;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、opengl、extctrls;
タイプ
TfrmMain = クラス(TForm)
タイマー 1: T タイマー;
プロシージャ FormCreate(Sender: TObject);
プロシージャ FormDestroy(Sender: TObject);
手順フォームペイント(送信者:tobject);
手順formkeydown(sender:tobject; var key:word;
シフト: TShiftState);
手順formsize(sender:tobject);
プロシージャ Timer1Timer(送信者: TObject);
プロシージャ FormClose(Sender: TObject; var Action: TCloseAction);
プライベート
{プライベート宣言}
HRC:HGLRC;
W、H:整数;
緯度、経度:glfloat;
半径:Gldouble;
公共
{公的宣言}
手順セットライト;
手順和解;
手順mydraw;
手順initializegl(var width:glsizei; height:glsizei);
終わり;
変数
frmmain:tfrmmain;
実装
{$R *.dfm}
手順tfrmmain.formcreate(sender:tobject);
変数
PFD:tpixelformatdescriptor;
pixelformat:整数;
始める
ControlStyle:= ControlStyle+[csopaque];
FillChar(PFD、SIZEOF(PFD)、0);
PFDを使用してください
始める
nsize:= sizeof(tpixelformatdescriptor);
nversion:= 1;
dwflags:= pfd_draw_to_windowまたは
PFD_SUPPORT_OPENGLまたはPFD_DOUBLEBUFFER;
ipixelType:= pfd_type_rgba;
ccolorbits:= 24;
cdepthbits:= 32;
ilayertype:= pfd_main_plane;
終わり;
pixelformat:= choosepixelformat(canvas.handle、@pfd);
setPixElformat(Canvas.Handle、Pixelformat、@pfd);
HRC:= wglCreateContext(canvas.handle);
W:= clientRect.right;
H:= clientRect.Bottom;
initializegl(w、h);
終わり;
手順tfrmmain.formdestroy(sender:tobject);
始める
wgldeletecontext(hrc);
終わり;
手順tfrmmain.formpaint(sender:tobject);
始める
wglmakecurrent(canvas.handle、hrc);
GlClearcolor(1,1,1,1);
glcolor3f(1,0,0);
glclear(gl_color_buffer_bitまたはgl_depth_buffer_bit);
detextures;
mydraw;
セットライト;
glflush;
終わり;
手順tfrmmain.mydraw;
変数
QOBJ:Gluquadricobj;
始める
glpushmatrix;
glclear(gl_color_buffer_bitまたはgl_depth_buffer_bit);
glcolor3f(1,0,0);
Glrotated(0.5,0.0,1.0,0.0);
Glrotated(-latitude、1.0,0.0,0.0);
グロテーション(経度、0.0,0.0,1.0);
QOBJ:= glunewquadric;
gluquadricdrawstyle(qobj、glu_line);
Glusphere(QOBJ、0.5、20、20);
swapbuffers(canvas.handle);
セットライト;
detextures;
終わり;
{手順tfrmmain.formresize(sender:tobject);
変数
nrange:glfloat;
始める
nrange:= 50.0;
W:= clientWidth;
h:= clientheight;
H = 0の場合
H:= 1;
glviewport(0,0、w、h);
glmatrixmode(gl_projection);
glloadidentity;
w <= hの場合
glortho(-nrange、nrange、-nrange*h/w、nrange*h/w、
-nrange、nrange)
それ以外
glortho(-nrange*h/w、nrange*h/w、-nrange、nrange、
-nrange、nrange);
glmatrixmode(gl_modelview);
glloadidentity;
塗り直し;
終わり;
}
手順tfrmmain.formkeydown(sender:tobject; var key:word;
シフト: TShiftState);
始める
key = vk_escapeの場合
近い;
key = vk_upの場合
glrotatef(-5,1.0,0.0,0.0);
key = vk_downの場合
glrotatef(5,1.0,0.0,0.0);
key = vk_leftの場合
glrotatef(-5,0.0,1.0,0.0);
key = vk_rightの場合
glrotatef(5.0,0.0,1.0,0.0);
塗り直し;
終わり;
手順tfrmmain.formresize(sender:tobject);
始める
glmatrixmode(gl_projection);
glloadidentity;
Glfrustum(-1.0,1.0、-1.0,1.0,3.0,7.0);
glviewport(0,0、clientWidth、clientheight);
塗り直し;
無効;
終わり;
手順tfrmmain.initializegl(var width:glsizei; height:glsizei);
変数
maxObjectsize、aspect:glfloat;
近いプレーン:gldouble;
始める
glclearindex(0);
glcleardepth(1.0);
Glenable(gl_depth_test);
glmatrixmode(gl_projection);
アスペクト:= 1.0;
Gluperspective(45.0、Aspect、3.0,7.0);
glmatrixmode(gl_modelview);
近いプレーン:= 0.3;
maxObjectsize:= 0.3;
radius:= near_plane+maxobjectsize/2.0;
緯度:= 0.3;
経度:= 0.6;
終わり;
手順tfrmmain.timer1timer(sender:tobject);
始める
timer1.Enabled:=false;
mydraw;
収率;
Timer1.Enabled:= true;
終わり;
手順tfrmmain.formclose(sender:tobject; var action:tcloseaction);
始める
timer1.Enabled:=false;
hrc <> nullの場合
wgldeletecontext(hrc);
終わり;
手順tfrmmain.setlighting;
変数
glfloatのArray [1..4]。
MaterialDiffuse:glfloatの配列[1..4]。
MaterialSpecular:glfloatの配列[1..4]。
アンビエントライトポジション:glfloatの配列[1..4]。
Lightambient:glfloatの配列[1..4]。
マテリアルシニネス:glfloat;
始める
gatemortambient [1]:= 0.5;
gatemortambient [2]:= 0.8;
gatemortambient [1]:= 0.2;
gatemortambient [1]:= 1.0;
MaterialDiffuse [1]:= 0.4;
MaterialDiffuse [2]:= 0.8;
MaterialDiffuse [3]:= 0.1;
MaterialDiffuse [4]:= 1.0;
MaterialSpecular [1]:= 1.0;
MaterialSpecular [2]:= 0.5;
MaterialSpecular [3]:= 0.1;
MaterialSpecular [4]:= 1.0;
マテリアルシニネス:= 50.0;
アンビエントライトポジション[1]:= 0.5;
アンビエントライトポジション[2]:= 1.0;
アンビエントライトポジション[3]:= 1.0;
アンビエントライトポジション[4]:= 0.0;
Lightambient [1]:= 0.5;
Lightambient [2]:= 0.2;
Lightambient [3]:= 0.8;
Lightambient [4]:= 1.0;
glmaterialfv(gl_front、gl_ambient、@materialambient);
glmaterialfv(gl_front、gl_diffuse、@materialdiffuse);
glmaterialfv(gl_front、gl_specular、@materialspecular);
glmaterialfv(gl_front、gl_shininess、@materialshininess);
gllightfv(gl_light0、gl_position、@ambientlightposition);
gllightModelfV(gl_light_model_ambient、@lightambient);
Glenable(gl_lighting);
Glenable(gl_light0);
glshademodel(gl_smooth);
終わり;
手順tfrmmain.settextures;
変数
ビット:glubyteのアレイ[1..64,1..64,1..64]。
BMP:tbitmap;
I、J:整数;
始める
bmp:= tbitmap.create;
bmp.loadfromfile( 'd:/dsoft/1119/02/logon.bmp');
i:= 1から64の場合
j:= 1〜64の場合
始める
bits [i、j、1]:= glbyte(getrvalue(bmp.canvas.pixels [i、j]));
bits [i、j、2]:= glbyte(getrvalue(bmp.canvas.pixels [i、j]));
bits [i、j、3]:= glbyte(getrvalue(bmp.canvas.pixels [i、j]));
ビット[i、j、4]:= 255;
終わり;
glpixelstorei(gl_unpack_alignment、4);
gltexparameteri(gl_texture_2d、gl_texture_wrap_s、gl_clamp);
gltexparameteri(gl_texture_2d、gl_texture_mag_filter、gl_nearest);
gltexparameteri(gl_texture_2d、gl_texture_min_filter、gl_nearest);
{0はシングルカラーシェーディングレベルを表し、GL_RGBAは混合値を表します
64x64はテクスチャの高さと幅を表し、0は境界線を表しません。
gl_rgbaはテクスチャタイプを表し、gl_unsigned_typeはデータ型、@generationオブジェクトアドレスを表します}
glteximage2d(gl_texture_2d、0、gl_rgba、64,64,0、gl_rgba、
gl_unsigned_byte、@bits);
Glenable(gl_texture_2d);
gltexenvf(gl_texture_env、gl_texture_env_mode、gl_decal);
終わり;
終わり。