1

我正在使用 SlimDX/D3D11 编写粒子系统管理器,并且发现常量缓冲区存在一些问题。

我的粒子系统管理器可以同时绘制多个具有不同物理特性的粒子系统,并且基于XNA的Particle 3D样本。绘制操作的总体思路是:

  • context.ClearRenderTargetView(...)
  • 渲染粒子
  • 交换链.Present()

“渲染粒子”操作是这样实现的:

  • shaderTimeGlobalVariable.Set(currentTime)
  • 对于着色器技术的每个通道:
    • 申请通行证
    • 对于每个粒子系统:
      • 使用物理常量设置常量缓冲区 (EffectConstantBuffer.SetRawValue)
      • 发出一个或多个 context.Draw 调用

我的问题是,似乎只考虑了最后一个常量缓冲区调用,从而迫使所有粒子系统具有相同的物理特性。

所以,首先:我怀疑这是正确/预期的,我错过了一些关键点。谁能澄清我错过了什么?

我希望一个解决方案是将粒子的物理特性插入到顶点缓冲区中,每个顶点的成本大约增加 12 个字节,因此对于我正在使用的每个物理系统来说,成本会增加 12k 到 120k。如果可能的话,我想避免的事情:还有其他选择吗?

4

1 回答 1

2

如果您更改着色器变量,则必须(重新)应用该通道。所以你的步骤将是:

  • 设置时间
  • 对于每个粒子系统
    • 设置常量缓冲区
    • 每次通过
      • 申请通行证

Depending on the actual buffer data, you can reorder the calls for performance optimization.

The reason, why you have to apply the pass after setting the constant buffers, is that the effect framework sends data to the GPU on apply-calls only.

于 2012-06-11T21:28:31.550 回答