2016-04-06 12 views
0

私はopengl-esについて知りません。私はアンドロイドアプリで.obj 3Dモデルの機能を使用する必要があります。 .objファイルには、Vertices、Texcoords、Normalsがあります。インデックスはなく、代わりに顔の要素があります。 誰かが.objファイルからインデックスを取得する方法を私に明確に説明できますか?.objからインデックスを取得

+0

Wavefrontオブジェクトファイルの仕様 – Raki

+0

を読む必要があります。 http://www.martinreddy.net/gfx/3d/OBJ.spec –

+0

はい、それはウィキペディアのようなものです。それを使って、顔からインデックスを取得する方法を知っています。顔はインデックスのみを使用して形成されます。 – Raki

答えて

2

OBJが頂点と考えるものは、OpenGLが頂点と考えるものではないため、明らかに少し難しいかもしれません。見つけよう...

OBJファイルは、obj-vertices(v)、テクスチャ座標(vt)、法線(n)のリストを設定します。おそらくこれをOpenGLに渡したいとは思わないでしょう(ただし、警告の終わりにスキップしてください)。彼らはただなど

あなたの積載コードがv1vt3の意味を確立するための方法、OpenGLの頂点がfステートメント内で指定されている唯一の場所です。例えば。 v1/vt1/vn1は、 "位置、テクスチャ座標、およびノー​​マルがリストに戻って指定されたOpenGL頂点"を意味します。

だから負荷に対する実行可能な解決策は、擬似コードである:

  • は、OpenGL頂点インデックスにv/vt/vnトリプルから空のハッシュマップ、空OpenGLの頂点のリスト、およびそれ以降のインデックスの空のリストをインスタンス化します願書glDrawElementsへ; OBJファイル内
  • 各トリプルについて
  • に:それはそうならば、インデックスを取得し、あなたの要素のリストに追加し、OpenGLの頂点リストにすでに存在するかどうかを判断するためにハッシュマップに
    • 表情。
    • もしそうでなければ、次の利用可能なインデックスをトリプルに割り当てて(これはちょうど増分する数字です)、それをハッシュマップと要素リストに入れ、トリプルを結合してそれをOpenGL頂点リストに挿入します。

あなたはそれが時間の描画であなたのOpenGL-頂点リストに暗示性の高いランダムアクセスを最小限に抑えるために試みることによってそれよりも良いことをしようことができますが、途中で最適化しません。


警告:

あなたのGPUは頂点テクスチャは、(頂点シェーダ内すなわちテクスチャサンプリング)をフェッチサポートしている場合は、あなただけに、など、OBJ-頂点を蓄積した、OpenGLの直接トリプルを供給できますテクスチャマップを作成し、頂点シェーダで間接参照を行います。頂点テクスチャフェッチでは、テクスチャは実際にはランダムアクセス2次元配列になります。しかし、多くのAndroid GPUは頂点テクスチャのフェッチをサポートしていません(ES3をサポートしていても、それが表面的に必要とするものであっても、最大ゼロサンプラをサポートするよう指定できます)。

関連する問題