テクスチャ描画
ここでは、テクスチャを使ってチャンネルを描画する簡単なインターフェイスを紹介します:
このインターフェイスは、上下左右の壁の4つの部分に簡単に分けることができます。先ほどの研究で、各面は実際には多くの三角形で構成されていることがわかりました。
例えば、床の図面です:
複数の三角形を1つの台形に組み合わせたイメージです。
上記の例に従うと、天井、床、壁の合計3つのテクスチャが必要です。
で3つのマクロ定義、テクスチャを保持する配列、テクスチャファイル名の配列を作成します:
#define TEXTURE_BRICK 0 //
#define TEXTURE_FLOOT 1 //
#define TEXTURE_CEILING 2 //
#define TEXTURE_COUNT 3 //テクスチャの数
GLuint textures[TEXTURE_COUNT];//テクスチャ配列
//ファイルタグ名の配列
const char *szTextureFiles[TEXTURE_COUNT] = { "brick.tga", "floor.tga", "ceiling.tga" };
//4バッチ・コンテナ・クラス
GLBatch floorBatch;//
GLBatch ceilingBatch;//
GLBatch leftWallBatch;//
GLBatch rightWallBatch;//
テクスチャの設定
前のセクションによると、テクスチャを設定する手順は次のとおりです:
- テクスチャマーカの生成
- テクスチャファイルを読み込みます。
- テクスチャパラメータの設定
- テクスチャの読み込み
ここでは3つのテクスチャが必要なので、forループを直接使って関連するテクスチャを生成し、設定しています:
//テクスチャを読み込む
GLbyte *pBytes;
GLint iWidth, iHeigth, iComponents;
GLenum eFormat;
GLint iLoop;
//テクスチャマーカーを生成する
glGenTextures(TEXTURE_COUNT, textures);
//テクスチャ配列のパラメータをループする
for (iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++) {
glBindTexture(GL_TEXTURE_2D, textures[iLoop]);
//TGAファイルを読み込む
pBytes = gltReadTGABits(szTextureFiles[iLoop], &iWidth, &iHeigth, &iComponents, &eFormat);
//テクスチャパラメータ - 拡大/縮小フィルタ
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//ズームフィルター
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);//フィルタリング方法を減らす
//テクスチャパラメータ - surround
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//テクスチャの読み込み
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeigth, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
//テクスチャの寸法
glGenerateMipmap(GL_TEXTURE_2D);
free(pBytes);
}
頂点の設定
ここでは、4つのバッチクラスで4セットの頂点データを生成する必要があります:
//ジオメトリの頂点/テクスチャ座標を設定する (Top). . .右)
GLfloat z;//Z深さ、トンネルの深さ
floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
for(z = 60.0f; z >= 0.0f; z -=10.0f)
{
floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
floorBatch.Vertex3f(-10.0f, -10.0f, z);
floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
floorBatch.Vertex3f(10.0f, -10.0f, z);
floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
}
floorBatch.End();
ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
for(z = 60.0f; z >= 0.0f; z -=10.0f)
{
ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
ceilingBatch.Vertex3f(-10.0f, 10.0f, z);
ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
ceilingBatch.Vertex3f(10.0f, 10.0f, z);
}
ceilingBatch.End();
leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
for(z = 60.0f; z >= 0.0f; z -=10.0f)
{
leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
leftWallBatch.Vertex3f(-10.0f, -10.0f, z);
leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
leftWallBatch.Vertex3f(-10.0f, 10.0f, z);
leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
}
leftWallBatch.End();
rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
for(z = 60.0f; z >= 0.0f; z -=10.0f)
{
rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
rightWallBatch.Vertex3f(10.0f, -10.0f, z);
rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
rightWallBatch.Vertex3f(10.0f, 10.0f, z);
rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
}
rightWallBatch.End();
テクスチャ描画
テクスチャの描画は、以前のメタ描画プロセスとほぼ同様ですが、ここにも若干の変更があります:
- ビュー モデル マトリックス スタック
- マトリックスシェーダーをテクスチャーに置き換える方法
- テクスチャのバインド
- バッチクラス描画
ここでは、左右のテクスチャは同じテクスチャなので、バインドを1回だけ行い、左右のバッチクラス描画を行います。
//呼び出し、シーンを描く
void RenderScene(void)
{
//現在のクリアカラーでウィンドウをクリアする
glClear(GL_COLOR_BUFFER_BIT);
//モデルビュースタック
modelViewMatrix.PushMatrix();
//Z軸移動 viewZ 距離
modelViewMatrix.Translate(0.0f, 0.0f, viewZ);
//テクスチャ置換マトリックスシェーダ
/*
パラメータ 1: GLT_SHADER_TEXTURE_REPLACE((シェーダー・ラベル)
パラメータ2:モデルビューの投影行列
パラメーター3:テクスチャーレイヤー
*/
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
//テクスチャをバインドする
/*
パラメータ1:テクスチャモード,GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_3D
パラメータ2:バインドするテクスチャ。
*/
glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_FLOOR]);
floorBatch.Draw();
glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_CEILING]);
ceilingBatch.Draw();
glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_BRICK]);
leftWallBatch.Draw();
rightWallBatch.Draw();
//pop
modelViewMatrix.PopMatrix();
//バッファの入れ替え
glutSwapBuffers();
}
プログラムを実行して、最初に見たい効果を得ます。




