私が見た 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