希望する効果
解析
- ピラミッドを変換する座標系
三角形バッチクラス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;
上記は重要なアイデアとコードです。最後に添付します。





