单个Present之前的多个常量缓冲区更新

时间:2012-06-11 18:23:08

标签: directx shader slimdx directx-11 particle-system

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

我的粒子系统管理器可以同时绘制具有不同物理特征的多个粒子系统,并且基于XNA的Particle 3D sample。绘制操作的一般概念是:

  • context.ClearRenderTargetView(...)
  • 渲染粒子
  • swapChain.Present()

“渲染粒子”操作的实现如下:

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

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

所以,首先:我怀疑这是正确的/预期的,我错过了一些关键点。任何人都可以澄清我错过了什么吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

根据实际的缓冲区数据,您可以重新排序调用以进行性能优化。

为什么在设置常量缓冲区后必须应用传递的原因是效果框架仅在应用调用时将数据发送到GPU。