blog

iOS Vision (VIII) -- OpenGLテクスチャの使用例

インターフェイスは単純に4つの部分に分けることができます:上、下、左、右と4つの壁。これまでの研究で、それぞれの面は実際には多くの三角形で構成されていることがわかりました。 これは、複数の三角形を組み...

Jun 29, 2020 · 5 min. read
シェア

テクスチャ描画

ここでは、テクスチャを使ってチャンネルを描画する簡単なインターフェイスを紹介します:

このインターフェイスは、上下左右の壁の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;// 

テクスチャの設定

前のセクションによると、テクスチャを設定する手順は次のとおりです:

  1. テクスチャマーカの生成
  2. テクスチャファイルを読み込みます。
  3. テクスチャパラメータの設定
  4. テクスチャの読み込み

ここでは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. ビュー モデル マトリックス スタック
  2. マトリックスシェーダーをテクスチャーに置き換える方法
  3. テクスチャのバインド
  4. バッチクラス描画

ここでは、左右のテクスチャは同じテクスチャなので、バインドを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();
}

プログラムを実行して、最初に見たい効果を得ます。

Read next

USDNはパブリックチェーンコントラクトトークンなのか?

USDNはパブリックチェーンNGKに基づくアルゴリズム安定コインであり、スマートコントラクト技術に依存し、米ドルとの強い信頼1:1アンカリングを完成させ、さまざまなユーザーのニーズに応えます。USDNはアルゴリズムによって価格の安定を実現し、市場での流通量がUSDNの発行量を決定します。 USDNは、3つのメカニズムを持つスマートコントラクトを使用して発行されます。USDN流通通貨、自由に取引できるデジタル通貨、...

Jun 29, 2020 · 2 min read

jQueryの基本機能

Jun 28, 2020 · 2 min read

デザインパターンの注意点

Jun 28, 2020 · 15 min read

Javaスクリプトを始める

Jun 28, 2020 · 3 min read