GLAUX(AUX) API リファレンス


GLAUX (単にAUX) ライブラリとは、OpenGL 補助ライブラリのことで、現在では GLUT ライブラリに置き換わった一世代前のライブラリです。

UNIX 版, Windows 版等があり、GLUT ライブラリ同様に AUX ライブラリを用いて作成したプログラムは、ほぼそのまま他のプラットフォームに移植することができます。

AUX ライブラリを使用したプログラムは、GLUT ライブラリに変更することをおすすめします。 AUX ライブラリから GLUT ライブラリに変更することは、非常に簡単です。 一部の例外を除いて AUX ライブラリにある関数、定数の名前が変わるだけです。
詳しくはAUX2GLUTをご覧ください。


■ GLAUX 機能一覧


■ GLAUX API 一覧(アルファベット順)


■ 初期化

void auxInitDisplayMode(GLenum type);

void APIENTRY auxInitDisplayMode(GLenum type);

ディスプレイモードを論理和で type に設定します。

カラー: AUX_RGB, AUX_RGBA または AUX_INDEX
バッファ: AUX_SINGLE または AUX_DOUBLE
ダイレクト: AUX_DIRECT または AUX_INDIRECT
アキュムレーションバッファ: AUX_ACCUM
アルファバッファ: AUX_ALPHA
デプスバッファ: AUX_DEPTH
ステンシルバッファ: AUX_STENCIL
補助バッファ: AUX_AUX

デプスバッファ: AUX_DEPTH(AUX_DEPTH16と等価) または AUX_DEPTH24
パレット: AUX_FIXED_332_PAL

例) RGB モード、ダブルバッファ、直接レンダリング、デプスバッファ
auxInitDisplayMode(AUX_RGB | AUX_DOUBLE | AUX_DIRECT | AUX_DEPTH);

void auxInitPosition(int x, int y, int width, int height);

void APIENTRY auxInitPosition(int x, int y, int width, int height);

ウィンドウの表示位置(x, y) とウィンドウサイズ(width, height) を指定します。

例) 表示位置(0, 0), ウィドウサイズを(256, 256)
auxInitPosition(0, 0, 256, 256);

void InitDisplayModePolicy(GLenum type);

void APIENTRY auxInitDisplayModePolicy(GLenum type);

ディスプレイモードのポリシーを type で指定します。
AUX_USE_ID, AUX_EXACT_MATCH, AUX_MINIMUM_CRITERIA のいずれか。
デフォルトは AUX_MINIMIM_CRITERIA。条件に合うビジュアル(ピクセルフォーマット)で最初に見つかったものを選択します。
AUX_EXACT_MATCH は条件に合うビジュアル(ピクセルフォーマット)のうち、最もカラーバッファのサイズが大きいものを選択します。
AUX_USE_ID はビジュアル(ピクセルフォーマット)を auxInitDisplayModeID を用いて、番号で直接指定します。
(古い GLAUX ライブラリではサポートしていません。)

例) ディスプレイモードのポリシーを AUX_EXACT_MATCH でウィンドウを開きます。

  	auxInitDisplayMode(AUX_RGB | AUX_DOUBLE | AUX_DEPTH);
  	auxInitDisplayModePolicy(AUX_EXACT_MATCH);
  	auxInitWindow("OpenGL");
  

GLenum InitDisplayModeID(GLint id);

GLenum APIENTRY auxInitDisplayModeID(GLint id);

ディスプレイモードのIDを id で指定します。
ディスプレイモードのポリシーが AUX_USE_ID の場合に、id で指定したビジュアル(ピクセルフォーマット)を選択します。
(古い GLAUX ライブラリではサポートしていません。)

例) 8 番のビジュアルを直接してウィンドウを開きます。

  	auxInitDisplayModePolicy(AUX_USE_ID);
  	auxInitDisplayModeID(8);
  	auxInitWindow("OpenGL");
  

■ イベント・プロセッシング

void auxMainLoop(void (*Func)(void));

typedef void (CALLBACK* AUXMAINPROC)(void);
void APIENTRY auxMainLoop(AUXMAINPROC);

メインのイベントループです。 ユーザ描画関数を設定します。

例) 球を描画するユーザ描画関数 display を設定します。
  void display(void)
  {
  	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  	glColor4f (1.0, 1.0, 1.0, 1.0);
  	auxSolidSphere (1.0);
  	glFlush();
  }

  int main(int argc, char** argv)
  {
  	:
  	auxMainLoop(display);
  }
  

■ ウィンドウ・マネージメント

GLenum auxInitWindow(char *title);

#ifdef UNICODE
#define auxInitWindow auxInitWindowW
#else
#define auxInitWindow auxInitWindowA
#endif
GLenum APIENTRY auxInitWindowA(LPCSTR title);
GLenum APIENTRY auxInitWindowW(LPCWSTR title);

auxInitDisplayMode および auxInitPosition で設定した内容でウィンドウを開きます。 ウィンドウのタイトルを title に設定します。

void auxCloseWindow(void);

void APIENTRY auxCloseWindow(void);

ウィンドウを閉じます。

void auxQuit(void);

void APIENTRY auxQuit(void);

アプリケーションを終了します。

void auxSwapBuffers(void);

void APIENTRY auxSwapBuffers(void);

ダブルバッファ時、バックバッファとフロントバッファを交換(またはコピー)します。

古い GLAUX ライブラリには auxSwapBuffers がなく、 代わりに glXSwapBuffers(auxXDisplay(), auxWindow()) を使わなければならないかもしれません。(X11)

Display *auxXDisplay(GLvoid); (UNIX のみ)

auxInitWindow で設定したディスプレイを返します。
例) auxSwapBuffers の代わりに glXSwapBuffers を使う例。
	glXSwapBuffers(auxXDisplay(), auxXWindow());

Window auxXWindow(GLvoid); (UNIX のみ)

auxInitWindow で設定したウィンドウを返します。
例) auxSwapBuffers の代わりに glXSwapBuffers を使う例。
	glXSwapBuffers(auxXDisplay(), auxXWindow());

int auxXScreen(void); (UNIX のみ)

auxInitWindow で設定したスクリーンを返します。
(古い GLAUX ライブラリではサポートしていません。)

HWND APIENTRY auxGetHWND(void);

auxInitWindow で設定した HWND を返します。

HDC APIENTRY auxGetHDC(void);

auxInitWindow で設定した HDC を返します。

HGLRC APIENTRY auxGetHGLRC(void);

auxInitWindow で設定した HGLRC を返します。

■ コールバック関数の設定

void auxReshapeFunc(void (*func)(int, int));

typedef void (CALLBACK* AUXRESHAPEPROC)(int, int);
void APIENTRY auxReshapeFunc(AUXRESHAPEPROC);

ウィンドウサイズの変更、移動等、ウィンドウ操作を行った場合に呼び出すコールバック関数を指定します。

コールバック関数
void func(int w, int h);
void CALLBACK func(int w, int h);
引数にウィンドウサイズ(w, h)が渡されます。 コールバック関数の実行後、再描画が自動的に実行されます。
例) リシェイプ・コールバック関数で、viewport、カメラの設定を行います。

  	void reshape(int w, int h)
  	{
  		glViewport(0, 0, w, h);
  		glMatrixMode(GL_PROJECTION);
  		glLoadIdentity();
  		glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
  		glMatrixMode(GL_MODELVIEW);
  		glLoadIdentity();
  	}
	
  	int main(int argc, char **argv)
  	{
  			:
  		auxReshapeFunc(reshape);
  			:
  	}
  

void auxExposeFunc(void (*func)(int, int));

typedef void (CALLBACK* AUXEXPOSEPROC)(int, int);
void APIENTRY auxExposeFunc(AUXEXPOSEPROC);

Expose イベント(ウィンドウをマップした時、隠れたウィンドウが表に出た時、ウィンドウの内容をクリアした時に発生するイベント)用コールバック関数を指定します。

コールバック関数
void func(int w, int h);
void CALLBACK func(int w, int h);
引数にウィンドウサイズ(w, h)が渡されます。

void auxIdleFunc(void (*func)(void));

typedef void (CALLBACK* AUXIDLEPROC)(void);
void APIENTRY auxIdleFunc(AUXIDLEPROC);

アイドル時に呼び出すコールバック関数を指定します。

コールバック関数
void func(void);
void CALLBACK func(void);



void auxKeyFunc(int key, void (*func)(void));

typedef void (CALLBACK* AUXKEYPROC)(void);
void APIENTRY auxKeyFunc(int key, AUXKEYPROC func);

キーイベントで呼び出すコールバック関数を指定します。
キーごとに呼び出すコールバック関数を変えることができます。
デフォルトでは、AUX_ESCAPE は auxQuit が登録されています。

定義済みキー
AUX_RETURN Enter/Returnキー
AUX_ESCAPE ESCキー
AUX_SPACE SPCキー
AUX_LEFT 左キー
AUX_UP 上キー
AUX_RIGHT 右キー
AUX_DOWN 下キー
AUX_A 〜 AUX_ZA 〜 Zキー
AUX_a 〜 AUX_za 〜 zキー
AUX_0 〜 AUX_90 〜 9キー

コールバック関数
void func(void);
void CALLBACK func(void);
コールバック関数の実行後、再描画が自動的に実行されます。

例) ESCキーを押すと、プログラムを終了する設定。
auxKeyFunc(AUX_ESCAPE, auxQuit);

void auxMouseFunc(int mouse, int mode, void (*func)(AUX_EVETREC *));

typedef void (CALLBACK* AUXMOUSEPROC)(void);
void APIENTRY auxMouseFunc(int mouse, int mode, AUXMOUSEPROC func);

マウスイベントで呼び出すコールバック関数を指定します。

mouseAUX_LEFTBUTTONマウスの左ボタン
AUX_RIGHTBUTTONマウスの右ボタン
AUX_MIDDLEBUTTONマウスの中央ボタン
modeAUX_MOUSEDOWNマウスボタンが押された時
AUX_MOUSEUPマウスボタンが離された時
AUX_MOUSELOCマウスボタンを押しながら移動した時

コールバック関数
void func(AUX_EVENTREC *event);
void CALLBACK func(AUX_EVENTREC *event);
コールバック関数の実行後、再描画が自動的に実行されます。

event->eventAUX_MOUSEDOWNマウスボタンが押された
AUX_MOUSEUPマウスボタンが離された
AUX_MOUSELOCマウスボタンを押しながら移動した

event->data[AUX_MOUSEX]マウスのX座標(左上が原点)
event->data[AUX_MOUSEY]マウスのY座標(左上が原点)
event->data[AUX_MOUSESTATUS]マウスボタン

■ カラーマップ

int auxGetColorMapSize(void);

int APIENTRY auxGetColorMapSize(void);

カラーマップ(パレット)のサイズを取得します。 auxGetColorMapSize で得られた値までの色数が使用できます。
カラーインデックスモードの時に使用します。

void auxSetOneColor(int index, float r, float g, float b);

void APIENTRY auxSetOneColor(int index, float r, float g, float b);

カラーマップ(パレット)の index 番の色を (r, g, b) に設定します。
カラーインデックスモードの時に使用します。

void auxSetFogRamp(int density, int startIndex);

void APIENTRY auxSetFogRamp(int density, int startIndex);

フォグ用にカラーマップ(パレット) を設定します。
基本の色(階調)を startIndex bit とし、フォグによる減衰に density bit 使用します。
シーン中に (1 << startIndex)階調 (例えば startIndex が 4 ならば 16階調)の色を使用し、 フォグにより (1 << density)段階 (例えば density が 3 ならば 8段階)に減衰するカラーマップを設定します。
カラーインデックスモードの時に使用します。

void auxSetGreyRamp(void);

void APIENTRY auxSetGreyRamp(void);

グレースケール用にカラーマップ(パレット) を設定します。
カラーインデックスモードの時に使用します。

void auxSetRGBMap(int size, float *rgb);

void APIENTRY auxSetRGBMap(int size, float *rgb);

カラーマップ(パレット) を一度に size 色設定します。
rgb には、R の 0 〜 size - 1、次に G の 0 〜 size - 1、最後に B の 0 〜 size - 1 を設定します。
カラーインデックスモードの時に使用します。

■ ステータス取得

void auxGetMouseLoc(int *x, int *y);

void APIENTRY auxGetMouseLoc(int *x, int *y);

マウスカーソルの位置を取得します。(左上隅が原点)

GLenum auxGetDisplayMode(void);

GLenum APIENTRY auxGetDisplayMode(void);

ディスプレイモードを取得します。
(古い GLAUX ライブラリではサポートしていません。)

GLenum auxGetDisplayModePolicy(void);

GLenum APIENTRY auxGetDisplayModePolicy(void);

ディスプレイモードのポリシーを取得します。
AUX_USE_ID, AUX_EXACT_MATCH, AUX_MINIMUM_CRITERIA のいずれか。
(古い GLAUX ライブラリではサポートしていません。)

GLint auxGetDisplayModeID(void);

GLint APIENTRY auxGetDisplayModeID(void);

ディスプレイモードのIDを取得します。
(古い GLAUX ライブラリではサポートしていません。)

long auxGetContext(void); (UNIX のみ)

グラフィックスコンテキストを取得します。
(古い GLAUX ライブラリではサポートしていません。)

■ 画像ファイル読み込み

AUX_RGBImageRec *auxRGBImageLoad(char *fileName);

#ifdef UNICODE
#define auxRGBImageLoad auxRGBImageLoadW
#else
#define auxRGBImageLoad auxRGBImageLoadA
#endif
AUX_RGBImageRec * APIENTRY auxRGBImageLoadA(LPCSTR fileName);
AUX_RGBImageRec * APIENTRY auxRGBImageLoadW(LPCWSTR fileName);

ファイル名 fileName のRGB形式(SGIフォーマット)の画像ファイルを読み込みます。(左下隅が原点)
主にテクスチャマッピング用の画像読み込みに利用します。

※ SGIフォーマット: SGI社のグラフィックスワークステーション(GWS)で使われていた画像ファイルフォーマット。 ランレングスによる可逆圧縮により、画質を落とすことなくファイルサイズを減らすことができるため、広く使われていました。
例) テクスチャマッピングに利用

  	AUX_RGBImageRect *img;
  		:
  	if ((img = auxRGBImageLoad("texture.rgb")) != NULL) {
  		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 
  			img->sizeX, img->sizeY, 0, GL_RBB, GL_UNSIGNED_BYTE,
  			img->data);
  		free(img->data);
  		free(img);
  	}
  

#ifdef UNICODE
#define auxDIBImageLoad auxDIBImageLoadW
#else
#define auxDIBImageLoad auxDIBImageLoadA
#endif
AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR fileName);
AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR fileName);

ファイル名 fileName のDIB形式(Windows BMP 形式)の画像ファイルを読み込みます。(左下隅が原点)
主にテクスチャマッピング用の画像読み込みに利用します。
この関数は Windows 限定です。
例) テクスチャマッピングに利用

  	AUX_RGBImageRect *img;
  		:
  	if ((img = auxDIBImageLoad("texture.bmp")) != NULL) {
  		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 
  			img->sizeX, img->sizeY, 0, GL_RBB, GL_UNSIGNED_BYTE,
  			img->data);
  		free(img->data);
  		free(img);
  	}
  

テクスチャマッピングでは、通常、左下隅を原点、S軸を右方向、T軸を上方向とします。

auxRBGImageLoad, auxDIBImageLoad は、左下隅を原点として画像を読み込みますので、そのままテクスチャマッピングに利用することができます。


■ フォント/文字列の描画

bitmapfont
GLAUX ライブラリは US-ASCII 256 種(有効な文字は0x20〜0x7e)の 8x13 ビットマップフォントをサポートしています。
文字幅は10.0です。

void auxCreateFont(void);

void APIENTRY auxCreateFont(void);

ビットマップフォントを作成します。

void auxDrawStr(char *str);

#ifdef UNICODE
#define auxDrawStr auxDrawStrW
#else
#define auxDrawStr auxDrawStrA
#endif
void APIENTRY auxDrawStrA(LPCSTR str);
void APIENTRY auxDrawStrW(LPCWSTR str);

文字列 str を auxCreateFont で作成したビットマップフォントを用いて描画します。
現在のラスターポジションから文字列を描画します。描画位置は glRasterPos* で設定します。
auxDrawStr に先立って auxCreateFont を呼び出し、ビットマップフォントを作成する必要があります。
例) 文字列を描画

  	auxCreateFont();
  		:
  	glColor3f(1.0, 1.0, 1.0);
  	glRasterPos2i(0, 0);
  	auxDrawStr("OpenGL");
  

■ 3Dオブジェクト描画

ティーポット以外のオブジェクトにはテクスチャ座標は定義されません。 このため、テクスチャマッピングを行う場合は、glTexGen によるテクスチャ座標の自動生成を用いる必要があります。
glTexGen によるテクスチャ座標の自動生成では、面単位でテクスチャ座標軸を変更することができないため、 オブジェクト単位で同じ座標系でのマッピングとなります。


wiresphere

void auxWireSphere(GLdouble radius);

void APIENTRY auxWireSphere(GLdouble radius);

ワイヤーフレームの球を描画します。球の半径を radius で指定します。
球の中心は原点(0, 0, 0)で、極はZ軸です。経線を16個、緯線を16個に分割されます。
内部で gluSphere を呼び出しています。

solidsphere

void auxSolidSphere(GLdouble radius);

void APIENTRY auxSolidSphere(GLdouble radius);

ソリッドモデルの球を描画します。球の半径を radius で指定します。
球の中心は原点(0, 0, 0)で、極はZ軸です。経線を16個、緯線を16個に分割されます。
内部で gluSphere を呼び出しています。

wirecube

void auxWireCube(GLdouble size);

void APIENTRY auxWireCube(GLdouble size);

ワイヤーフレームの立方体を描画します。立方体の1辺の長さを size で指定します。
立方体の中心は原点(0, 0, 0)です。

solidcube

void auxSolidCube(GLdouble size);

void APIENTRY auxSolidCube(GLdouble size);

ソリッドモデルの立方体を描画します。立方体の1辺の長さを size で指定します。
立方体の中心は原点(0, 0, 0)です。

wirebox

void auxWireBox(GLdouble width, GLdoubel height, GLdouble depth);

void APIENTRY auxWireBox(GLdouble width, GLdoubel height, GLdouble depth);

ワイヤーフレームの直方体を描画します。直方体の大きさを width, height, depth で指定します。
直方体の中心は原点(0, 0, 0)です。

solidbox

void auxSolidBox(GLdouble width, GLdoubel height, GLdouble depth);

void APIENTRY auxSolidBox(GLdouble width, GLdoubel height, GLdouble depth);

ソリッドモデルの直方体を描画します。直方体の大きさを width, height, depth で指定します。
直方体の中心は原点(0, 0, 0)です。

wiretorus

void auxWireTorus(GLdouble innerRadius, GLdoubel outerRadius);

void APIENTRY auxWireTorus(GLdouble innerRadius, GLdoubel outerRadius);

ワイヤーフレームのトーラスを描画します。inner 5分割、outer 10分割。
中心は原点(0, 0, 0)であり、Z軸回りのトーラスを描画します。

solidtorus

void auxSolidTorus(GLdouble innerRadius, GLdoubel outerRadius);

void APIENTRY auxSolidTorus(GLdouble innerRadius, GLdoubel outerRadius);

ソリッドモデルのトーラスを描画します。inner 8分割、outer 15分割。
中心は原点(0, 0, 0)であり、Z軸回りのトーラスを描画します。

wirecylinder

void auxWireCylinder(GLdouble radius, GLdoubel height);

void APIENTRY auxWireCylinder(GLdouble radius, GLdoubel height);

ワイヤーフレームの円柱を描画します。
円柱の半径を radius、円柱の高さを height で指定します。 円周は12分割、高さは2分割。
Y軸方向に伸びる円柱で、上下面の蓋はなく閉じていません。
内部で gluCylinder を呼び出しています。(Z軸に-1.0移動後、X軸 -90度回転)
OBJECT_LINEAR でテクスチャ座標を自動生成する場合、X軸回転を行っていることに注意してください。

solidcylinder

void auxSolidCylinder(GLdouble radius, GLdoubel height);

void APIENTRY auxSolidCylinder(GLdouble radius, GLdoubel height);

ソリッドモデルの円柱を描画します。
円柱の半径を radius、円柱の高さを height で指定します。 円周は12分割、高さは2分割。
Y軸方向に伸びる円柱で、上下面の蓋はなく閉じていません。
内部で gluCylinder を呼び出しています。(Z軸に-1.0移動後、X軸 -90度回転)
OBJECT_LINEAR でテクスチャ座標を自動生成する場合、X軸回転を行っていることに注意してください。

wireicosahedron /

void auxWireIcosahedron(GLdouble radius);

void APIENTRY auxWireIcosahedron(GLdouble radius);

ワイヤーフレームの20面体を描画します。

solidicosahedron /

void auxSolidIcosahedron(GLdouble radius);

void APIENTRY auxSolidIcosahedron(GLdouble radius);

ソリッドモデルの20面体を描画します。

wireoctahedron

void auxWireOctahedron(GLdouble radius);

void APIENTRY auxWireOctahedron(GLdouble radius);

ワイヤーフレームの8面体を描画します。

solidoctahedron

void auxSolidOctahedron(GLdouble radius);

void APIENTRY auxSolidOctahedron(GLdouble radius);

ソリッドモデルの8面体を描画します。

wiretetrahedron

void auxWireTetrahedron(GLdouble radius);

void APIENTRY auxWireTetrahedron(GLdouble radius);

ワイヤーフレームの4面体を描画します。

solidtrahedron

void auxSolidTetrahedron(GLdouble radius);

void APIENTRY auxSolidTetrahedron(GLdouble radius);

ソリッドモデルの4面体を描画します。

wiredodecahedron

void auxWireDodecahedron(GLdouble radius);

void APIENTRY auxWireDodecahedron(GLdouble radius);

ワイヤーフレームの12面体を描画します。

soliddecahedron

void auxSolidDodecahedron(GLdouble radius);

void APIENTRY auxSolidDodecahedron(GLdouble radius);

ソリッドモデルの12面体を描画します。

wirecone

void auxWireCone(GLdouble base, GLdouble height);

void APIENTRY auxWireCone(GLdouble base, GLdouble height);

ワイヤーフレームの円錐を描画します。
Z軸周り15分割、Z軸に沿って10分割。
円錐の底面の中心が原点(0, 0, 0)、半径 base で、(0, 0, height)が円錐の先端となります。 底面は蓋はなく、閉じていません。
内部で gluCone を呼び出しています。

solidcone

void auxSolidCone(GLdouble base, GLdouble height);

void APIENTRY auxSolidCone(GLdouble base, GLdouble height);

ソリッドモデルの円錐を描画します。
Z軸周り15分割、Z軸に沿って10分割。
円錐の底面の中心が原点(0, 0, 0)、半径 base で、(0, 0, height)が円錐の先端となります。 底面は蓋はなく、閉じていません。
内部で gluCone を呼び出しています。

wireteapot

void auxWireTeapot(GLdouble scale);

void APIENTRY auxWireTeapot(GLdouble scale);

ワイヤーフレームのユタ・ティーポットを描画します。
グリッド10。
テクスチャ座標の生成にも対応。

ライティングを行う場合は、GL_AUTO_NORMAL を有効にして法線の自動生成を行う必要があります。
また、内部で glScalef を使っているため、スケールが 1.0 でなく、法線の正規化が必要です。 (他にスケール変更していない場合は、法線の再スケーリング(GL_RESCALE_NORMAL)でも可能。OpenGL 1.2 以上)

左手系でモデリングされているため、Z方向を-1.0倍して面の向きを変更するか、 glFrontFace(GL_CW) で表面の向きを変更する必要があります。
(テクスチャマッピングを行う場合は、そのままではそれぞれ画像が上下反転、上下左右反転します。 詳しくは auxSolidTeapot の説明をご覧ください。)
例) ティーポットを描画(Z 方向を-1.0倍する場合)

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glPushMatrix();
  	glScalef(1.0, 1.0, -1.0);
  	auxWireTeapot(0.6);
  	glPopMatrix();
  
例) 面の向きを変える場合

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glFrontFace(GL_CW);
  	auxWireTeapot(0.6);
  	glFrontFace(GL_CCW);
  

solidteapot

void auxSolidTeapot(GLdouble scale);

void APIENTRY auxSolidTeapot(GLdouble scale);

ソリッドモデルのユタ・ティーポットを描画します。
グリッド14。
テクスチャ座標の生成にも対応。

ライティングを行う場合は、GL_AUTO_NORMAL を有効にして法線の自動生成を行う必要があります。
また、内部で glScalef を使っているため、スケールが 1.0 でなく、法線の正規化が必要です。 (他にスケール変更していない場合は、法線の再スケーリング(GL_RESCALE_NORMAL)でも可能。OpenGL 1.2 以上)

左手系でモデリングされているため、Z方向を-1.0倍して面の向きを変更するか、 glFrontFace(GL_CW) で表面の向きを変更する必要があります。
例) ティーポットを描画(Z 方向を-1.0倍する場合)

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glPushMatrix();
  	glScalef(1.0, 1.0, -1.0);
  	auxSolidTeapot(0.6);
  	glPopMatrix();
  
scale ただし、そのままテクスチャマッピングを行うと、画像の上下が逆となります。
例) テクスチャマッピングを行う(Z 方向を-1.0倍する場合)

  	glMatrixMode(GL_TEXTURE);
  	glLoadIdentity();
  	glScalef(1.0, -1.0, 1.0);
  	glMatrixMode(GL_MODELVIEW);

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glPushMatrix();
  	glScalef(1.0, 1.0, -1.0);
  	auxSolidTeapot(0.6);
  	glPopMatrix();
  
texture_scale テクスチャマトリックスを用いて、T を -1.0 倍することで上下反転します。

例) 面の向きを変える場合

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glFrontFace(GL_CW);
  	auxSolidTeapot(0.6);
  	glFrontFace(GL_CCW);
  
cw テクスチャの上下、左右が逆となるので注意。
例) テクスチャマッピングを行う(面の向きを変える場合)

  	glMatrixMode(GL_TEXTURE);
  	glLoadIdentity();
  	glScalef(-1.0, -1.0, 1.0);
  	glMatrixMode(GL_MODELVIEW);

  	glEnable(GL_AUTO_NORMAL);
  	glEnable(GL_NORMALIZE);    /* または glEnable(GL_RESCALE_NORMAL); */
  	glFrontFace(GL_CW);
  	auxSolidTeapot(0.6);
  	glFrontFace(GL_CCW);
  
texture_cw テクスチャマトリックスを用いて、S, T を -1.0 倍することで上下反転、左右反転します。


[3D TOPメニュー]
[OpenGL] [irisGL] [VRML] [作品集] [イエローページ]
[書籍紹介] [DVD]
[この Web ページについて] [アンケート] [予定]
[OpenGLストア]

[Namazu TOPメニュー]