1

このスレッドからの回答に従っています: Binding Multiple Textures to One Mesh in OpenGL ES 1.1

私の実装は機能していないようで、その理由がわかりません。

私のコードの事実は次のとおりです。

  • textureArray は、GLKTextureInfo オブジェクトによって設定された NSMutableArray です。
  • groupMesh は、以下を含む構造体の配列です。
    • インデックスを取得したいインデックス配列内の場所へのポインタ。
    • 索引データのサイズ

-

  • 頂点用に要素配列バッファを 1 つ、インデックス用に要素配列バッファを 1 つ持っています。

forループを作ることにしました。各反復で、GLKTextureInfo 配列から異なるテクスチャをバインドし、バインドしたばかりのテクスチャで描画するインデックス データのメモリ領域へのポインターを変更します。

-

for (int i = 0; i<mesh->numMeshes-1; i++)
{
    glBindTexture(GL_TEXTURE_2D,
                  [(GLKTextureInfo *)[textureArray objectAtIndex:i] name]);


    glDrawElements(GL_TRIANGLES,
                        mesh->groupMesh[i].indexDataSize*4,
                        GL_UNSIGNED_INT,
                        mesh->groupMesh[i].indexPointer);

}

配列の最初のテクスチャは樹皮のテクスチャで、2 番目のテクスチャは木の葉です。

ただし、最初の繰り返しの後、テクスチャは拘束されません。次のような結果が得られます。

http://img69.imageshack.us/img69/5138/tbko.png

私の理論が正しいかどうかをテストするためにループを強制し、objectAtIndex:i を objectAtIndex:1 に変更すると、葉のテクスチャが全体に現れました。

http://img266.imageshack.us/img266/5598/c05n.png

動作していないのは glBindTexture のようですが、opengl が既に描画状態にあるためですか? これを回避する方法はありますか?

注:(昨日同様の質問をしましたが、もう少し調査を行ったところ、何が間違っているのかわかりません)。

4

1 に答える 1

0

考えれば考えるほど、あなたのインデックスデータが実際にここで責任を負う可能性があります。

まず、GL_UNSIGNED_INT頂点配列要素インデックスのひどい選択です。42 億個の頂点が必要になることはめったにありませんGL_UNSIGNED_SHORT(最大 65536 個の頂点) が、特に組み込みデバイスで推奨されるインデックス タイプです。GL_UNSIGNED_BYTE頂点数が 256 未満のメッシュが魅力的かもしれませんが、ほとんどのハードウェアは 8 ビット インデックスをネイティブにサポートできないため、ドライバーにさらに作業を加えるだけです。

次に、実際にこの問題を引き起こしている可能性のあるものについて説明します。

mesh>groupMesh[i].indexDataSize*4描画する頂点の数に使用しています。これにより、インデックス配列がオーバーランし、indexDataSize*3多くの頂点が無効になります。奇妙に聞こえるかもしれませんが、描画された頂点の 3/4 が未定義の動作を引き起こすため、これがテクスチャリングの問題の原因である可能性があります。

于 2013-09-18T17:59:09.157 に答える