3

GLキットを使用して、画面上で回転する立方体を描画しています。私はこれを非常にうまく機能させており、各面に同じテクスチャが描かれています。顔ごとに違う質感を描きたいです。

これは現在、私のコードが立方体を描画する方法です(実際には、Textures配列に6つの異なるテクスチャがロードされていますが、これまでのところ、テクスチャを変更すると、立方体のすべての側面のみが同じように描画されます)。

self.effect.texture2d0.name = theTextures[i].name;
self.effect.texture2d0.enabled = true;
self.effect.texture2d0.target = GLKTextureTarget2D;

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

glBindVertexArrayOES(_vertexArray); 

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

私はここstackOverflowで多くの検索を行い、多くのチュートリアルを見てきましたが、これを行う簡単な方法を見つけることができません。辺ごとに頂点配列を作成し、頂点配列ごとにglDrawElementsを使用できると思いますが、それは非常に非効率的です。6つの異なる頂点配列を作成せずにこれを行う方法はありますか?ありがとう!

4

2 に答える 2

2

これを行うためのかなり一般的な方法は、テクスチャマップを使用することです。つまり、必要なすべてのサブテクスチャを含む1つのテクスチャです。このようにして、大量のテクスチャでシステムを過負荷にすることはありませんが、必要なすべてのグラフィックを取得できます。たとえば、ここにテクスチャが4つしかない場合、次のような画像が表示される可能性があります。

A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 

(注:テクスチャの側面が2の累乗(2、4、8、16、32 ...)の場合に最適に機能しますが、正方形である必要はありません!)

次に、テクスチャの一部を使用する場合は、正しいtx.s / tx.t座標を選択するだけで、その顔に必要な画像の部分を取得できます。

于 2013-06-02T02:01:58.763 に答える
-1

私はまだそれぞれの側を別々に描いていますが、これをいくらか効率的な方法で行うことに気づきました。辺ごとに異なる頂点配列とテクスチャを作成しますが、2つの三角形で記述された頂点を持つ1つのIndice配列のみを使用します。何か提案があれば、私の方法で送ってください、

// draw one texture per side

for (int i = 0; i <= 5; i++)
{
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[i]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, myTexture[i].name);

    glDrawElements(GL_TRIANGLES, sizeof(Indices1)/sizeof(Indices1[0]), GL_UNSIGNED_BYTE, 0);
}
于 2012-12-03T07:48:51.400 に答える