2012-04-23 7 views
2

私はwavefrontオブジェクトパーサーを完成させています。これを使ってジェネリックメッシュオブジェクトを構築したいと思います。私のエンジンはOpenGL 4とシェーダを使ってエンジンのすべてを描画します。一連のサブグループとしてOpenGLのメッシュをレンダリングする?

私の質問は、メッシュをレンダリングする際のレンダリングの効率を最大限に高める方法についてです。

wavefront .obj fileには、通常、多くのオブジェクトサブグループが指定されています。

サブグループには特定の素材(例:光沢のある赤色)が割り当てられている場合があります。

したがって、メッシュはそれぞれ独自のマテリアルが割り当てられたかなり複雑なサブグループの集合である可能性があります。

私の質問がある -

Q.私は別に、例えば、各サブグループを描画する必要がありますか各サブグループに対してglDrawElementsが呼び出されますか? (私は4つの別々のサブグループを持っていたのであれば、私はそれによって材料/テクスチャの4つの均一の変更()で4回シェーダを呼び出し、4 glDrawElements呼び出しを行う必要があるだろう)

glDrawElements(GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset); 

これが正しい場合、私は計算する必要があります:サブグループの開始オフセット(各サブグループのための別個のインデックスアレイ及びVAO暗示)各サブグループにおける

インデックス頂点を

これは非常に効率が悪いようですが、私は間違った木を吠えますか? Wavefront obj wiki pageからも

、:

Smooth shading across polygons is enabled by smoothing groups. 
s 1 
... 
    # Smooth shading can be disabled as well. 
    s off 
    ... 

誰でもスムーズシェーディング値を示すものを提案することはできますか?例えば。 s1、s2、s4など

+1

この質問は、前述のように、頂点データが何であるか、またそれを使って何をやっているのかを知らなくても答えられません。材料、シェイダーなどの質問はすべて衝撃性能です。 –

答えて

9

はい、他のグループとは別に各サブグループを描画する必要があります。これは、サブグループ間で状態が異なるまで必要です。

しかし、あなたはあまりにも長いステップを作っています。

複数の描画呼び出しを避けるために、均一な配列値(マテリアルの配列、テクスチャの配列)にアクセスするために使用されるインデックスを示す頂点属性を導入できます。この方法では、描画呼び出しは1つだけ必要ですが、追加の属性とその相対的な管理のコストがかかります。

私は上記のアプローチを避けるでしょう。サブグループがテクスチャ化されており、別のグループがテクスチャ化されていない場合あなたはテクスチャかどうかをどのように差別しますか?他の属性を紹介していますか?混乱しているようだ。

最初の点は、バッファオブジェクトの管理が非常に柔軟であることです。実際には、単一の要素バッファオブジェクトと単一の頂点バッファオブジェクトを持つことができます。オフセットとインターリーブを使用すると、あらゆるレベルの複雑さを満たすことができます。そして、現代のハーウェアでは、頂点配列オブジェクトを使用して、異なるバッファバインディングのコストを最小限に抑えることができます。

第2の点は、ソフトウェアが同じ統一状態の異なるサブグループをグループ化し、複数の描画呼び出しを1つに結合できることです。 マルチ抽象的なエントリポイントの変形を使用することができますし、プリミティブリスタートもあります(ストリッピングされたプリミティブの場合)。

複雑であるかどうかにかかわらず、とにかく描画する必要があるため、他の考慮事項は有用ではありません。あなたが正しいレンダリングをしたら、アプリケーションとレンダリングをプロファイルし、ホットスポットをカットすることができます。


スムージンググループは、同じオプション属性(法線、テクスチャ座標を)共有している頂点のコレクションです。これは、要素インデックス付き頂点の場合です。

詳しくは、specificationをご覧ください。

+0

こんにちは、あなたの答えをありがとう、私は必要な15評判のポイントを得るとき、私はあなたの応答をupvoteよ。 – fishfood

関連する問題