1

2D ゲーム エンジンに OpenGL レンダラーを追加していますが、mvp マトリックスを 1 回の描画呼び出しで頂点の一部にのみ適用する方法があるかどうかを知りたいですか?

テクスチャごとに描画呼び出しをグループ化することを計画しているので、多くの頂点と texcoord のバッファを渡します。次に、異なるクワッドに異なる回転角度を適用したいと考えています。シェーダーでそれを達成する方法はありますか、それともシェーダーの mvp マトリックスをあきらめて、CPU を使用して同じことを実行する必要がありますか?

編集:頂点ごとに 3 つの float 属性 (回転と rot_center.xy) を追加するのはどうですか?

より良いパフォーマンスは何ですか

(1) CPU ローテーションを行っていますか?

(2) 頂点ごとにさらに 3 つの float を提供する

(3) ドローコールの分離?

他のオプションはありますか?

4

3 に答える 3

1

ここに可能性があります:

  1. 頂点シェーダーで回転を行います。回転行列を頂点属性として作成するために必要な情報 (角度?) を渡します。

  2. 実質的に頂点ごとのブール値フラグである頂点属性 (ubyte) を渡します。#1 のローテーションは、bool が設定されている場合にのみ実行されます。

上記がパフォーマンス/ストレージの観点からうまくいくかどうかはわかりません.

于 2012-08-03T02:15:53.913 に答える
1

2 つの異なるオブジェクトを使用する、それだけです。

オブジェクトの一部を回転するための他の回避策はありません

例:

砲塔と残機を別々に回転させたい戦車のゲーム。あなたの場合のように、これら2つは別々のオブジェクトとして扱われます。

于 2012-08-05T16:08:15.730 に答える
1

さまざまなパフォーマンス上の理由からドローコールをグループ化することは良いことですが、ローテーションとして基本的な要件を満たすようにコードを変更することはお勧めできません。

描画のバッチ処理は良いことですが、追加の属性を保持する必要がある場合 (ユニフォームでは確実に実行できないため、単一のエンティティの情報が得られないため)、それは価値がありません。

追加の属性は、通常、最近のシステムのパフォーマンスの主な致命的な要因である、はるかに多くのメモリ帯域幅の使用を意味します。

一方、描画のバッチ処理は重要ですが、常に重要というわけではありません。次のような多くの要因に依存します。

  1. GPU OpenGL ドライバーの最適化
  2. GPU タイルの構成
  3. 私たちが話している形状/描画呼び出しの数 (画面に 20 個のクワッドがある場合、なぜわざわざバッチ処理をする必要があるのでしょうか? :))

言い換えれば、多くの場合、極端なバッチ処理をやめて簡単さ/メインテナビリティを優先し、ローテーションなどの単純な要件に対する派手なソリューションを避ける方がはるかに便利です。

これが何らかの形で役立つことを願っています。

于 2012-08-03T07:05:47.260 に答える