多个对象,不同的行为

时间:2014-08-08 17:18:08

标签: c++ graphics shader hlsl directx-11

我正在尝试使用DirectX 11.1构建一个俄罗斯方块游戏。 我可以使用简单的三角形条在屏幕上渲染一个坦克(边界)和一块(我塑造,形状......)。我还可以使用着色器的常量缓冲区移动这些对象的位置。

问题是我用一个缓冲区绑定顶点。 这导致罐和件一起移动,这不是理想的行为。 我想只移动碎片,而不是坦克。

如何分隔两个物体? 我应该为每个对象创建多个缓冲区吗? 如果是这样,我是否必须多次渲染?

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。您应该记住,您希望的情况是为每个对象进行单独的转换,并分别应用每个转换。您可能希望当时控制一个对象,但仍然希望对象的其余部分按照它们的放置方式进行转换(正确的旋转和平移)。

可以为每个对象创建一个单独的缓冲区,并分别渲染它们。你最终会得到很多小缓冲区,但是当你考虑创建新对象并破坏旧对象时,这种情况可能是最简单的。但是,如果你真的考虑过它,当你在块上销毁一行然后需要更新包含该行中至少一个块的所有缓冲区时,它会不方便吗?想一想。

现在,另一种方法是拥有一个缓冲区,只有在创建新对象或销毁对象时才会更新。您只能使用

绘制缓冲区的一部分
ID3D11DeviceContext::Draw(VertexCount,StartVertexLocation)

在这种情况下,每个Draw调用都有一个单独的变换矩阵,但是你将对象保存在一个缓冲区中。

最后还有一个解决方案,允许您通过一次调用渲染所有内容,即将所有对象存储在一个缓冲区中,方式与上一示例相同。但是,这次,每次创建或销毁对象时,都需要更新此缓冲区。在此解决方案中,您不必存储所有对象的转换。这些转换已应用于所有对象。但是在此解决方案中,您需要在CPU上的C ++代码中更新它们。不会有很多转变,所以它应该是有效的。