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 );
...

顶点着色器中的一行将顶点转换为屏幕空间:

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 世界视图矩阵乘法 - GPU 或 CPU 的地方

4

2 回答 2

1

不要忘记顶点着色器是按顶点运行的,你最终会在每帧中进行数百次的乘法运算,

而 AS3 版本每帧只进行一次乘法运算。

与每个性能问题一样:

优化经常运行的东西,忽略只偶尔运行的东西。

于 2012-07-19T15:31:14.137 回答
1

这是一个棘手的优化问题。您应该问的第一件事:这真的是瓶颈吗?如果是,您必须考虑这一点:

  • 在 AS3 中进行矩阵乘法比应有的速度要慢。
  • 顶点程序中的额外矩阵变换实际上是免费的。
  • 设置一个矩阵比设置多个矩阵为常数要快!
  • 无论如何,您是否需要连接矩阵?可以选吗?

没有简单的答案。为了速度,我会让 GPU 完成这项工作。但在许多情况下,您可能需要妥协:像经典的 OpenGL 一样发送模型->世界和世界->剪辑矩阵。对于 molehill 来说,在顶点程序中专门在 GPU 上做更多的工作。但在过分担心它之前,请始终确保这个问题确实是一个瓶颈。

tl/dr:如果可以,请在顶点程序中执行此操作!

于 2012-05-22T10:07:20.357 回答