0

私はこの考えを持っていましたが、VBO と FloatBuffers について、それが有効かどうかを知るのに十分な知識がありません。プログラム内のデータを削減するために、顔データを単一の文字列として保持し、レンダリング時に String.split("/") で分割するというアイデアがありました。これにより、WaveFront .OBJ ファイルと同様に、データから冗長な頂点がすべて削除されます。モデルのサイズを大幅に縮小しながら、顔を描画するたびに GPU の速度が少し低下するだけだと思います。ただし、VBO と FloatBuffer は、パックされている場合とアンパックされている場合の両方で、単一の float[] で表される頂点データの一貫した配列を取ります。OGLES2.0 はすべてのデータを 1 つのバッファに順番に入れたいようです。だから、私の考えは持ちこたえていないようです。

元:

冗長性あり:

バッファ = { x1, x2, x3... x30,000 }

(顔を順番に一気に描く)

それなし:

バッファ = { x1, x2, x3... x1,000 }

fData[x] = "x/x/xx/x/xx/x/x"

(一度に 1 つずつ、fData[x] の参照に従って各面を描画します)

私の質問は次のとおりです。

  1. バッファ内の冗長な頂点を除外し、レンダリング時に .OBJs fData を使用して面を組み立てることは適切ですか? なぜですか、そうでないのですか?

  2. そうでない場合、私の制限は何ですか? 冗長性を追加する前に、約 1,000 個の頂点を持つモデルがあります。VBO または FloatBuffer は、Android で (冗長性を備えた) 多くの頂点を処理できますか? これらのモデルのうち、メモリが不足する前に一度にレンダリングできるモデルの数はどれくらいでしょうか?

  3. もしそうなら、どのように OGLES2.0 に私のデータが各面のバッファ内のどこにあるかを知らせることをお勧めしますか? Buffer.setPosition(x)?

  4. Android およびその他の OpenGL のフレーバーで一般的に受け入れられているモデル ストレージの方法は何ですか? データ量を可能な限り最小のサイズに減らすために、各モデルをどのように保存しますか?

事前に助けてくれてありがとう。

編集: 5. glDrawElements は私の問題を解決しますか? 現在、glDrawArrays を使用しています。冗長な頂点が存在する場合は glDrawElements の方が優れていると信じるようになった投稿をどこかで読んだところです。これは正しいです?

4

1 に答える 1

0

探していたものが見つかりました。その答えは、実際、glDrawElements を使用することでした。glDrawElements を使用して、一意の頂点を FloatBuffer または VBO に割り当ててから、面データを FloatBuffer または VBO に割り当てます。glDrawElements はこれら 2 つの Buffer を受け取り、作業を行います。

float vertsCoords[] = {0.5f, 0.5f, 0.5f,          //V0
                                  -0.5f, 0.5f, 0.5f,           //V1
                                  -0.5f, -0.5f, 0.5f,         //V2
                                   0.5f, -0.5f, 0.5f,         //V3
                                   0.5f, -0.5f, -0.5f,       //V4
                                   0.5f,  0.5f, -0.5f,       //V5
                                  -0.5f, 0.5f, -0.5f,       //V6
                                  -0.5f, -0.5f, -0.5f,     //V7
                    }; 
GLubyte indices[] = {0, 1, 2, 3,              //Front face
                            5, 0, 3, 4,             //Right face
                            5, 6, 7, 4,             //Back face
                            5, 6, 1, 0,             //Upper face
                            1, 6, 7, 2,              //Left face
                            7, 4, 3, 2,             //Bottom face
                  }; 

glEnableClientState(GL_VERTEX_ARRAY);       
glVertexPointer(3, GL_FLOAT, 0, vertsCoords);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices);             

index[] = fData[] および vertCoords[] = vData!

たぁぁぁぁぁ!

編集:私はこの非常に、非常に残念なニュースを見つけたので、皆さんと共有したいと思いました。

gamedevs.net より引用。"_Walrus" は言います、

描画配列メソッドから共有頂点を減らす (つまり、冗長な頂点を削除する) 場合、その 1 つの頂点に複数の texCoords を指定できないという問題が発生します。これは立方体で説明する方が簡単だと思います。立方体では、頂点が 3 回繰り返されます (つまり、コーナー)。したがって、立方体の各面は (幾何学的に言えば) まったく同じ頂点を持ちますが、各面は異なる tex Coord を持つ場合があります。インデックス リストに移動するときに削減率を下げると、1 つの頂点に対して複数の tex coord の問題が発生します。Opengl は、(インデックス リストに関して) 1 つの頂点に対して複数の texCoord をサポートしません。また、他の配列 (法線、色など) でもサポートしません。したがって、ルールは次のとおりだと思います。ジオメトリをデシメートするときは、法線、位置、texCoord などを共有する冗長な頂点のみを削除します。

=(

于 2013-07-27T12:04:31.357 に答える