2011-12-25 27 views
2

テクスチャアトラスを使わずに単純なキューブマッピングをしたいのですが、私はいつでも私のテクスチャのいずれかを見ることができますバインドすることができますが、1つ以上、6だけでなく、行うことはできません。以下は私の描画ループのコードです。OpenGL ES 1.1 Android Cubemapping

/*Cube to draw */ 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cube); 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[2]); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, circleTexCoords);  
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[3]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[4]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[5]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[6]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D,mTextures[7]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); 

私はここで何か基本的なものを見逃していますか?

私が行ったこと: はい、私はテクスチャバッファを生成しました。 はい、リソースから適切にテクスチャをロードしてバインドしました。 上記のコードは、テクスチャをバインドする代わりにglColorfを使用して描画します。

ご協力いただきありがとうございます。

編集:私は、キューブ生成方法

private float box[] = new float[] { 
     // FRONT 
     -0.5f, -0.5f, 0.5f, 
     0.5f, -0.5f, 0.5f, 
     -0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     // BACK 
     -0.5f, -0.5f, -0.5f, 
     -0.5f, 0.5f, -0.5f, 
     0.5f, -0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     // LEFT 
     -0.5f, -0.5f, 0.5f, 
     -0.5f, 0.5f, 0.5f, 
     -0.5f, -0.5f, -0.5f, 
     -0.5f, 0.5f, -0.5f, 
     // RIGHT 
     0.5f, -0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     0.5f, -0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     // TOP 
     -0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     -0.5f, 0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     // BOTTOM 
     -0.5f, -0.5f, 0.5f, 
     -0.5f, -0.5f, -0.5f, 
     0.5f, -0.5f, 0.5f, 
     0.5f, -0.5f, -0.5f, 
}; 

/* Initialize values for cube */ 
ByteBuffer bb = ByteBuffer.allocateDirect(Float.SIZE * box.length); 
bb.order(ByteOrder.nativeOrder()); 
cube = bb.asFloatBuffer(); 
cube.put(box); 
cube.rewind(); 

CircleTexCoordsは誤った名称であるが、私はユニットのテクスチャとしてそれを使用していますが、いくつかの異なるテクスチャ座標:

bb = ByteBuffer.allocateDirect(Float.SIZE * 8); 
bb.order(ByteOrder.nativeOrder()); 
circleTexCoords = bb.asFloatBuffer(); 
circleTexCoords.put(new float[] { 0f, 1f, 1f, 1f, 0f, 0f, 1f, 0f}); 
circleTexCoords.rewind(); 
+0

'cube'と' circleTexCoords'には何が含まれていますか? –

+0

これらを追加するためのコードが追加されました。 – nmjohn

+0

ああ、それを得た、私はそれを推測した! –

答えて

1

あなた頂点配列が一致しません。あなたのケースで頂点とtecCoordsで現在有効になっている属性配列から描画するとき、配列はもちろんサイズで一致する必要があります。 glDrawArrays(..., 8, 4)を呼び出すと、8番目の要素から始まる4つの配列要素(頂点)を描画するようにOpenGLに指示します。しかし、あなたのtexCoord配列には4つの頂点だけが含まれています.texCoordsの頂点4-23は頂点配列内にどういったものでしょうか?あるいは、OpenGLは、4つの連続する頂点ごとにtexCoordsを繰り返すことをどのように知るべきかを知るべきです。

だから、それを動作させるには、texCoordsを自分で繰り返す必要があります。有効なすべての配列のサイズは、描画するときに一致する必要があります(少なくとも最後の描画要素まで)。したがって、この小さいcircleTexCoordsアレイを再利用するというあなたの考えはうまくいかないでしょう。

これは、概念的に頂点は単なる位置ではなく、すべての属性(位置、法線、texCoords、...)の補完であるからです。同様に頂点は配列の要素がglVertexPointerにバインドされているだけでなく、現在有効になっているすべての配列からです。これはまた、OpenGLで重複しない2つの異なるtexCoordを持つ単一の頂点を持つことができない理由です。なぜなら、もはや単一の頂点ではないからです。これは、位置属性の名前をの頂点という名前にするのは悪い選択でしたが、これは旧来の理由からであり、最新のOpenGLでクリーンアップされています。

+0

クリスチャンの答えと説明をありがとう。これは理にかなっており、実際にはこれらの変更が必要に応じて機能することを確認しました。 – nmjohn

関連する問題