2

ウェーブフロント オブジェクト パーサーを完成させており、それを使用して汎用メッシュ オブジェクトを構築したいと考えています。私のエンジンは OpenGL 4 とシェーダーを使用してエンジン内のすべてを描画します。

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

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

サブグループには、特定のマテリアル (光沢のある赤色など) が割り当てられている場合があります。

したがって、メッシュはサブグループのかなり複雑なコレクションであり、それぞれに独自のマテリアルが割り当てられています。

私の質問は -

Q. サブグループごとに glDrawElements を呼び出すなどして、各サブグループを個別に描画する必要がありますか? (したがって、4 つの個別のサブグループがある場合、4 つの glDrawElements 呼び出しを行う必要があるため、4 つの均一な変更 (マテリアル/テクスチャ用) でシェーダーを 4 回呼び出す必要があります)。

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

これが正しければ、次のように計算する必要があります。

各サブグループのインデックス (サブグループごとに個別のインデックス配列と VAO を意味する) サブグループの開始点の頂点オフセット

これは非常に効率が悪いように思えます。間違ったツリーを鳴らしているのでしょうか?

また、Wavefront obj wiki ページから:

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

滑らかなシェーディング値が何を示しているかを誰かが提案できますか? 例: s1、s2、s4 など。

4

1 に答える 1

8

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

しかし、あなたはあまりにも長い一歩を踏み出しています。

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

私は上記のアプローチを避けます。サブグループがテクスチャ付きで、別のサブグループがそうでない場合はどうなりますか? テクスチャを付けるかどうかをどのように判断しますか? 他の属性を導入?紛らわしいようです。

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

2 番目のポイントは、ソフトウェアが同じ均一な状態を持つ異なるサブグループをグループ化し、複数の描画呼び出しを 1 つの描画呼び出しに結合できることです。マルチドロー エントリ ポイント バリアントを使用できることに注意してください。また、プリミティブを再起動することもできます (ストリップされたプリミティブの場合)。

複雑かどうかに関係なく、とにかく描画する必要があるため、他の考慮事項は役に立ちません。続いて、適切なレンダリングが得られたら、アプリケーションとレンダリングをプロファイリングして、ホットスポットを切り離すことができます。


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

この件についてさらに詳しく知りたい場合は、グーグルで見つけた仕様の 1 つを読んでください。

于 2012-04-24T17:56:58.413 に答える