5

私が見た Stage3D の例はすべて、レンダリング イベントごとに AS3 でモデル ビュー射影マトリックスを構築します。例えば:

modelMatrix.identity();
// Create model matrix here
modelMatrix.translate/rotate/scale
...
modelViewProjectionMatrix.identity();
modelViewProjectionMatrix.append( modelMatrix );
modelViewProjectionMatrix.append( viewMatrix );
modelViewProjectionMatrix.append( projectionMatrix );
// Model view projection matrix to vertex constant register 0
context3D.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX, 0, modelViewProjectionMatrix, true );
...

そして、頂点シェーダーの 1 行で頂点をスクリーン スペースに変換します。

m44 op, va0, vc0

このようにする理由はありますか?GPU はこのような計算のために作られたのではないでしょうか。

代わりに、それぞれを変更して別々のレジスタにアップロードするときに、ビューと射影行列のみを更新しないのはなぜですか :

// Projection matrix to vertex constant register 0
// This could be done once on initialization or when the projection matrix changes
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, projectionMatrix, true);
// View matrix to vertex constant register 4
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 4, viewMatrix, true);

次に、各フレームと各オブジェクトについて:

modelMatrix.identity();
// Create model matrix here
modelMatrix.translate/rotate/scale
...
// Model matrix to vertex constant register 8
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 8, modelMatrix, true);
...

シェーダーは代わりに次のようになります。

// Perform model view projection transformation and store the results in temporary register 0 (vt0)
// - Multiply vertex position by model matrix (vc8)
m44 vt0 va0 vc8
// - Multiply vertex position by view matrix (vc4)
m44 vt0 vt0 vc4
// - Multiply vertex position by projection matrix (vc0) and write the result to the output register
m44 op vt0 vc0

アップデート

ここで、この質問に既に回答している可能性のある別の質問を見つけました:
DirectX world view matrix multiplications - GPU or CPU the place

4

2 に答える 2

1

これは難しい最適化問題です。最初に尋ねる必要があるのは、それが本当にボトルネックなのかということです。はいの場合、これを考慮する必要があります。

  • AS3で行列の乗算を行うと、本来よりも遅くなります。
  • 頂点プログラムの追加の行列変換は実質的に無料です。
  • 1つの行列を設定する方が、複数の行列を定数として設定するよりも高速です。
  • とにかくどこか別の場所に連結行列が必要ですか?多分ピッキング?

簡単な答えはありません。速度を上げるために、GPUに作業を任せます。しかし、多くの場合、妥協が必要になる可能性があります。従来のOpenGLのように、モデル->ワールドとワールド->クリップマトリックスを送信します。モルヒルの場合、特に頂点プログラムのGPUでより多くの作業を行います。ただし、あまり心配する前に、この問題が本当にボトルネックであることを常に確認してください。

tl / dr:可能であれば、頂点プログラムで実行してください。

于 2012-05-22T10:07:20.357 に答える
1

頂点シェーダーは頂点ごとに実行され、フレームごとに何百、何千回も乗算を行うことになることを忘れないでください。

AS3 バージョンはフレームごとに 1 回だけ乗算を行います。

すべてのパフォーマンスの問題と同様に:

頻繁に実行されるものを最適化し、時々しか実行されないものは無視します。

于 2012-07-19T15:31:14.137 に答える