3Dモデルの予算。より重要な三角形または頂点の数


12

3Dゲームのモデルを作成するとき、予算のポリゴン(三角形)または頂点で何を測定する必要がありますか?2つのセット40000キューブで実験を行いました。1つは8つの頂点と12の三角形、もう1つは24の頂点と12の三角形です。すべてUnityで行われ、両方とも手続き的に生成されました。驚いたことに、両方のセットのパフォーマンスはほぼ同じで、両者の違いはわずかでした。

頂点の数を気にせず、三角形の数だけを見る必要があるということですか?

編集:19602の三角形と10000の頂点を持つ平面を作成し、同じ量のティラングルが39204の頂点を持つ別の実験を作成しました。私は両方の4000を生成しました。頂点の数が14 fpsから19 fpsになりました。だから、一般的には少ないほうが良いと思うが、大きな違いがあるだけだ。


9
ゲームを作成し、問題が発生したら修正します。この種の問題は決して発生しない可能性があり、時間を無駄にしています:P
Vaillancourt

回答:


16

地形に使用するような大きなグリッドメッシュを想像してみましょう。n1回の描画呼び出しで、たとえば1080p画面の半分をカバーするだけの三角形をレンダリングします。

すべての頂点を溶接し、スムージング/テクスチャリングの継ぎ目がない場合、各三角形には3つの頂点があり、各頂点は6つの三角形に共有されているため、n/2頂点があります。

これをレンダリングするには、次のことが必要です。

  • 少なくともn/2何度も頂点シェーダーを実行する

    (「少なくとも」頂点結果のキャッシュが非常に大きいためです。場合によっては、既に変換した頂点を追い出し、それを共有する後の三角形で再度必要になるため、頂点シェーダーを再実行します。 。したがって、紙のように見えるほどの節約はありません)

  • クリップとカリングのn三角形。

  • 少なくとも1920x1080 / 2または約100万ピクセルのフレームバッファーでラスタライズと補間を行います(テレインが画面の約半分をカバーすると言ったため)。

    (「少なくとも」GPUがピクセルのクワッドで動作する方法のため、ポリゴンのエッジのすぐ外側の一部のフラグメントはまだラスタライズされますが、その後マスクされます。つまり、フラグメントを2回処理します。最初にポリゴンを深さバッファーに描画するのに十分な運がない場合、それ自体をオクルードします)

  • 100万以上のフラグメントすべてに対してフラグメントシェーダーを実行します。

  • 〜100万件の結果をフレームバッファーと深度バッファーにブレンドします。

さて、今度はすべての頂点のウェルドを解除3nして、レンダリングする頂点を用意しました。これは以前の6倍です!私たちのステップは...

  • 頂点シェーダーを実行する 3n

    (すべての頂点が一度だけ使用されるため、キャッシュによるアスタリスクはありませんが、これはキャッシュが時間を節約できないことを意味します)

  • クリップとカリングのn三角形。

  • 少なくとも1920x1080 / 2または約100万ピクセルのフレームバッファーをラスタライズおよび補間します。

  • 100万以上のフラグメントすべてに対してフラグメントシェーダーを実行します。

  • 〜100万件の結果をフレームバッファーと深度バッファーにブレンドします。

...待って、最初のステップを除くすべてのステップは同じです!したがって、GPUが典型的な描画呼び出しで行う作業のほとんどは、使用される頂点の数に直接関係しません。スクリーンカバレッジの量、オーバードロー、および三角形の総数が、コストの大部分を占めています。

それは、頂点が完全に自由であることを意味しません。頂点を共有できる場合、特に頂点シェーダーが複雑であるか、ハードウェアの頂点パイプラインが弱い場合(古いコンソールの場合のように)、キャッシュによってある程度の節約が得られます。ただし、三角形の数に一定の係数をプラスまたはマイナスすると、頂点数が追跡されることを考えると、通常、全体的なメッシュコストの指標としてはそれほど興味深いものではありません。


それらの頂点をメモリに送信するコストはどうですか?
ミチャウレシチスキ

7
フレームごとに頂点バッファーを変更しない限り、そのアップロードコストを1回支払います。テクスチャとフレームバッファは、特定のフレーム内のビデオメモリと帯域幅の大きな塊です。頂点は確かに無料ではないことを意味し、実用的な場合は共有する方が良いですが、共有されていない頂点がゲームのパフォーマンスを低下させる理由になることはめったにありません。
DMGregory

ゲームで森などをやっているので、これに追加されます。私が始めたとき、私は最初に描画呼び出しを使用して(私は自分のエンジンを使用します、これはあなたの質問と完全に一致しないかもしれません)、頂点のみでモデルを描画しました、これ自体は大丈夫で、パフォーマンスは良好でした。しかし、インデックス作成を使い始めたとき、一部の頂点が共有されてキャッシュされたため、一部の計算が2回行われなかったため、パフォーマンスが向上しました。要するに、頂点のみの生のテストは、頂点とトライカウントの最良の指標ではありません。パイプラインは、いずれかが多すぎます。他の答えが暗示するように。
アーニーディンゴ

2

どちらでもない。

本当に膨大な数のトリス(数百万)を話していない限り、あなたが気にすることは:

  • レンダリングされたピクセルの数
  • フラグメントシェーダーのコスト
  • 描画呼び出しの数(制限はデバイスに強く依存します)。

24の頂点に4000のキューブを掛けると、96'000の頂点が得られます。

640x380ピクセルは243'200のフラグメントを生成し、ほとんどのデバイスはかなり大きな解像度をサポートします。

1'000'000キューブで実験を再実行し、描画呼び出しのボトルネック(1'000キューブに対して1つの単一モデル)を回避するためにバッチ処理することができます。


2
これは、シーンとレンダリング方法に大きく依存します。自然に比較的少ないオーバードローが自然に発生するシーンがある場合、頂点処理が確かにパフォーマンスを支配します。また、描画呼び出しの数は、描画呼び出し間で状態が変化するほど問題ではありません(一部のAPIでは)。
ニコルボーラス

1

WebGLアプリケーションを実行している場合、頂点カウントはユーザーがダウンロードするファイルサイズの点ですぐにボトルネックになることに注意してください。三角形の数は同じですが、DCCソフトウェアで表示される頂点の2〜3倍の頂点が多い。この場合、縫い目を少なくすることにより、より良いアンラッピングが非常に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.