blog

ピラミッドのレンダリングとテクスチャの追加

ここでは、三角形の構成が異なるため、同じ点は、対応するテクスチャ座標が異なる場合がありますので、各ポイントは、異なる三角形で使用されるため、△DAB点Aテクスチャ座標であるが、△DAB点Aテクスチャ座...

Aug 23, 2020 · 5 min. read
シェア

希望する効果

解析

  • ピラミッドを変換する座標系

三角形バッチクラスGLBatchを使用して、合計6つの三角形(△ODA、△ODC、△OCB、△OBA、△DAB、△DBC)のグラフィックレンダリング全体を完成させ、各三角形の頂点座標を構築します。

{
0.0, 1.0, 0.0,
-1.0, -1.0, -1.0,
-1.0, -1.0, 1.0
}
  • 次に、△ODAと下△DAB、△BCDに対応するテクスチャ座標を見る ここで、組成物を構成する異なる三角形のため、同じ点は、対応するテクスチャ座標は、各点が異なる三角形で使用されるため、同じではないかもしれません、△DABは点Aのテクスチャ座標であるが、△DABは点Aのテクスチャ座標である。バッチクラスを使用して、各頂点と対応するテクスチャ座標を順番に入力します。
 /*pyramidBatch経由で三角形のバッチを形成する。
 パラメータ1:タイプ
 パラメータ2:頂点数
 パラメータ3:このバッチでは1つのテクスチャが適用される
 注:このパラメーターを書かないと、デフォルトは0になる。
 */
 pyramidBatch.Begin(GL_TRIANGLES, 18, 1);
 
 /***例)インポート
 
 2)テクスチャ座標を設定する
 void MultiTexCoord2f(GLuint texture, GLclampf s, GLclampf t);
 パラメータ1:texture、テクスチャレベル、ストレージシェーダーでレンダリングする場合は0に設定する。
 パラメータ2: s: 対応する頂点座標のx座標
 パラメータ 3: t:頂点座標のyに対応する。
 (s,t,r,q対応する頂点座標x,y,z,w)
 
 pyramidBatch.MultiTexCoord2f(0,s,t);
 
 3)void Vertex3f(GLfloat x, GLfloat y, GLfloat z);
 void Vertex3fv(M3DVector3f vVertex);
 三角形のバッチ・クラスに頂点データを追加する(x,y,z);
 pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f);
 
 */
 
 // 
 M3DVector3f pointO = {0.0f, 1.0f, 0.0f};
 M3DVector3f pointA = {-1.0f, -1.0f, 1.0f};
 M3DVector3f pointB = {1.0f, -1.0f, 1.0f};
 M3DVector3f pointD = {-1.0f, -1.0f, -1.0f};
 M3DVector3f pointC = {1.0f, -1.0f, -1.0f};
 
 //ピラミッドの底
 //一番下のクアッド= DAB+ である。
 //DAB= (pointD,pointA,pointB)
 //pointD
 pyraminBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
 pyramidBatch.Vertex3fv(pointD);
 
 //pointA
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointA);
 
 //pointB
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointB);
 
 
 //である。=(pointB,pointC,pointD)
 //pointB
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointB);
 
 //pointC
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
 pyramidBatch.Vertex3fv(pointC);
 
 //pointD
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
 pyramidBatch.Vertex3fv(pointD);
 
 // ピラミッドの正面
 //である。,pointA,pointB)
 pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
 pyramidBatch.Vertex3fv(pointO);
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointA);
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointB);
 
 //ピラミッドの左側
 //である。, pointD, pointA)
 pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
 pyramidBatch.Vertex3fv(pointO);
 
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointD);
 
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointA);
 
 //ピラミッドの右側
 //である。, pointB, pointC)
 pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
 pyramidBatch.Vertex3fv(pointO);
 
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointB);
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointC);
 
 //ピラミッドの裏側
 //OCD: (pointO, pointC, pointD)
 pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
 pyramidBatch.Vertex3fv(pointO);
 
 pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointC);
 
 pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
 pyramidBatch.Vertex3fv(pointD);
 
 //バッチセットアップを終了する
 pyramidBatch.End();
  • bool LoadTGATexture(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode)カスタム関数を使用してTGAファイルを2Dテクスチャとしてロードします。内部実装は以下の通りです。
 GLbyte *pBits;
 int nWidth, nHeight, nComponents;
 GLenum eFormat;
 
 //テクスチャビットを読み込み、ピクセルを読み込む
 //パラメータ1:テクスチャファイル名
 //パラメータ2:ファイル幅アドレス
 //パラメータ3:ファイルの高さアドレス
 //パラメータ4:ファイルコンポーネントアドレス
 //パラメータ5:ファイル・フォーマット・アドレス
 //戻り値:pBits,イメージデータへのポインタ
 
 pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
 if(pBits == NULL)
 return false;
 
 //テクスチャ・パラメータを設定する
 //パラメータ1:テクスチャの寸法
 //パラメータ2:S/T座標のモードを設定する。
 //パラメータ3:wrapMode,wrapMode
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
 
 //パラメータ1:テクスチャの寸法
 //パラメータ2:線形フィルタリング
 // : ズームイン/アウト・フィルタリング・メソッド.
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
 
 //3.テクスチャをロードする
 //パラメータ1:テクスチャの寸法
 //パラメータ2:mipテクスチャレベル
 //パラメータ3:テクスチャユニットに格納されている色成分
 //パラメータ4:テクスチャ幅をロードする
 //パラメータ5:Load texture high
 //パラメータ6:ロードされるテクスチャの深さ
 //パラメータ7:ピクセルデータのデータ型(GL)_UNSIGNED_BYTE,(各色成分は8ビットの符号なし整数)
 //パラメータ8:テクスチャイメージデータへのポインタ
 
 glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0,
 eFormat, GL_UNSIGNED_BYTE, pBits);
 //使用後にpBitsを解放する
 free(pBits);
 
 //MipマッピングはminFilterが以下の4つのモードと等しい場合にのみ生成できる。
 //GL_NEAREST_MIPMAP_NEAREST非常に優れたパフォーマンスと非常に弱いちらつきを持つ
 //GL_LINEAR_MIPMAP_NEARESTゲームのスピードアップによく使われる、高品質のリニアフィルターを使う
 //GL_LINEAR_MIPMAP_LINEAR  _NEAREST_MIPMAP_LINEAR フィルタはMipレイヤー間のフィルタトレースを除去するために、レイヤー間で余分な補間を行う。
 //GL_LINEAR_MIPMAP_LINEAR トリリニアMipマッピング。最高精度のテクスチャー・フィルタリングの黄金律だ。
 if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||
 minFilter == GL_LINEAR_MIPMAP_NEAREST ||
 minFilter == GL_NEAREST_MIPMAP_LINEAR ||
 minFilter == GL_NEAREST_MIPMAP_NEAREST)
 //4.すべてのMipレイヤーのテクスチャ生成
 //パラメータ: GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_3D
 glGenerateMipmap(GL_TEXTURE_2D);
 
 return true;

上記は重要なアイデアとコードです。最後に添付します。

Read next

Jsの継承

ニーモニック分類:プロトタイプ連鎖継承 + 借用コンストラクタ = 結合継承 + 寄生継承 = 寄生結合継承 プロトタイプ継承 ES6 継承 I. プロトタイプ連鎖継承 II. 借用コンストラクタ III. 結合継承 IV. プロトタイプ継承 V. 寄生継承 VI. 寄生結合継承

Aug 23, 2020 · 3 min read