如何在Direct3D9中实现独立的渲染层?

时间:2009-06-08 22:38:24

标签: c++ direct3d

我正在研究一个窗口化的Direct3D数据绘图应用程序,它需要在数据之上显示多个叠加层(类似于游戏中的HUD)。由于可能存在大量需要绘图的数据,并且并非每次都会更改所有叠加层,因此我认为当显示中只有一个叠加层发生变化时重新绘制顶点不是一个好主意。

这让我想到了将叠加层的纹理和顶点渲染为具有透明背景的多个纹理,这些纹理可以叠加在渲染循环中并独立更新(类似于Photoshop中的图层)。

在我开始更改此程序的大部分以渲染纹理而不是表面之前,我只是想知道使用纹理是否是最好的方法。

3 个答案:

答案 0 :(得分:0)

RTT效果很好,我在最近做过的游戏中使用过它。每个场景(场景指图层,“HUD”是场景,“Main”是主场景等...)渲染到纹理上,然后每个纹理渲染到四边形,排序回到前面(用于alpha混合) )。我选择这个只是将场景直接渲染到后台缓冲区,因为它允许我进行后期处理。

对于你的缓存目的,这似乎是最好的方法,但只要注意纹理可以快速占用内存,有时它只是更好地再次渲染所有内容,确保你排序回到前面。

答案 1 :(得分:0)

渲染到纹理肯定会起作用,可能是一条很好的路线,但它可能有点过分。现代3D硬件速度非常快,我建议您在投入大量时间对程序进行重大更改之前,在需要更新时验证性能是否真的是重新呈现的问题。

如果性能是一个问题,那么您可以更好地花时间优化渲染绘图的代码,因为这将有助于更新涉及数据更改以及仅更改覆盖的更新。我是游戏的图形程序员,通常使用实时3D,你希望将优化工作集中在最糟糕的情况下(你必须重绘所有内容)而不是你最好的(只有一个覆盖需要更新)。

答案 2 :(得分:0)

渲染到纹理渲染目标表面是一个非常好的主意,并且可以用于很多事情,例如优化/缓存,但要注意与常规alpha(a * c1 +(1-a)* c2)的混合操作;如果@是ARGB混合,那么l1 @ l2 @ l3!= l3 @ l1 @ l2;即它不是可交换的,但通过在所有纹理/层中使用预乘的alpha,可以使混合操作成为可交换的。

最终的参考文献是1984年的Porter / Duff文章“Compositing Digital Images”。