0

Blenderを使用して.objファイルを作成してから、ファイルを読み込んでメッシュを作成するカスタムパーサーを作成しようとしています。少し質問があります。私の例はblenderのキューブを使用していますが、質問をキューブを超えて拡張したいと思います。

Blenderでキューブを作成し、それを.objファイルとして保存すると、次のようになります...

# Blender v2.63 (sub 0) OBJ File: ''
# www.blender.org
mtllib cube.mtl
o Cube_Cube.001
v -0.911915 -0.851241 1.196067
v -0.911915 -0.851241 -0.803933
v 1.088085 -0.851241 -0.803933
v 1.088085 -0.851241 1.196067
v -0.911915 1.148759 1.196067
v -0.911915 1.148759 -0.803933
v 1.088085 1.148759 -0.803933
v 1.088085 1.148759 1.196067
usemtl 
s off
f 2 1 5 6
f 6 7 3 2
f 7 8 4 3
f 1 4 8 5
f 1 2 3 4
f 8 7 6 5

そして、私のメッシュレンダリング方法は次のようになります。

@Override
    public void draw(GL10 gl)
    {
        super.draw(gl);
        gl.glColor4f(255, 0, 255, 150);
        gl.glFrontFace(GL10.GL_CCW);
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);

        gl.glDrawElements(GL10.GL_TRIANGLE_FAN,vertexBuffer.array().length,GL10.GL_UNSIGNED_SHORT,indexBuffer);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
        gl.glColor4f(255, 255, 255, 255);
    }

このキューブを描画できるようにするには、インデックスバッファと頂点バッファにデータを入力するにはどうすればよいですか。1つの「drawElements」関数にすべての頂点を含めることはできますか、それとも三角形ごとに行う必要がありますか?.objファイルで4つを超える頂点が面になることはありますか?(2Dペンタゴンまたはヘキサゴンのように?)もしそうなら、私はそれらをどのように描くでしょうか?.OBJファイルはTriangファンまたはストリップを使用しますか?

ありがとう!

4

2 に答える 2

1

実際の効率向上という点では、バッファを GPU に保存する場合はほとんどありません。CPU でデータを計算し、フレームごとに GPU にバッファリングしている場合 (可能であれば避けるべきであり、GPU 自体に保存する必要があります)、三角形のファン/ストリップを使用してバッファ サイズを減らしています。ただし、ラスタライズ プロセス中、ラスタライザー ループが 3 つを超える頂点を持つ複雑な形状を反復処理する機能を持っていない限り (私は非常に疑いがあります)、とにかくポリゴンを三角測量する必要があります。

私は重い Android プログラマーではありませんが、使用している OpenGL のバージョンに「GenerateBuffer()」と「DrawArrays()」がある場合は、それらを使用してください。三角形のファン/ストリップを使用しても、ハードウェア コンポーネント間のバッファリング速度が向上するだけなので、Android デバイスに専用のグラフィック デバイスがない場合は、おそらく最適化を行う必要はありません。

それを行う方法に関しては、三角形のリストを三角形分割するだけです。トライアングル ストリップでは、すべてのトライアングルを反復処理して、前の各頂点と同じ 2 つの頂点位置を持つトライアングルのリストを見つける必要があります。三角形ファンの場合、すべての三角形を繰り返し処理し、前の各頂点と同じ 2 つの頂点位置を持つそれらのリストを見つける必要があります。また、それらはすべて同一の回転元頂点を持っている必要があります。

上記の説明は、三角測量アルゴリズムの逆です。


    Triangle Strip (与えられた "n" 個の頂点のリスト): 各三角形は "new Triangle(n-2, n-1, n)" であり、ここで (n > 2)
    Triangle Fan (与えられた "n" 個の頂点のリスト):各三角形は「new Triangle(0, n-1, n)」で、「0」は最初の要素で、(n > 2)

四角形の場合(コード例のように)、上記の三角形のファンアプローチを使用できます(三角形のストリップはブレンダーのobjファイルの四角形からは機能しません)。

于 2013-11-12T17:39:41.510 に答える
0

OpenGL とグラフィック カードは単なるマシンであり、三角形を非常に高速に描画します。したがって、最初に三角形に注目する必要があります。クワッドを無視します。とにかく、クワッドは通常、2 つの三角形のセットに置き換えられ、分割方法を制御することはできません。五角形などは、さらに多くの問題を引き起こします。ストリップとファンも無視してください。とにかく、一般的な 3D モデルは通常、三角形のみです。ファンとストリップは、特別な場合の最適化として使用できます。たとえば、高さマップからグリッドの形でランドスケープをモデル化する場合、トライアングル ストリップは非常に便利です。

于 2012-12-03T13:50:36.357 に答える