多个对象,不同的行为

Multiple objects, different behavior

本文关键字:对象      更新时间:2023-10-16

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

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

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

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

可以为每个对象创建单独的缓冲区,并分别呈现每个对象。你最终将拥有许多小缓冲区,但当你考虑创建新对象并销毁旧对象时,这种情况可能是最简单的。然而,如果你真的考虑一下,当你销毁块上的一行,然后,需要更新包含这一行中至少一个块的所有缓冲区,这是否方便?想想看。

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

只绘制部分缓冲区。
ID3D11DeviceContext::Draw(VertexCount,StartVertexLocation)

在这种情况下,你将有一个单独的转换矩阵为每个Draw调用,但你保持你的对象在一个缓冲区。

最后还有一个解决方案,它允许您用一个调用呈现所有内容,即将所有对象存储在一个缓冲区中,与前面的示例相同。然而,这一次,每当对象移动、创建或销毁时,都需要更新这个缓冲区。在这个解决方案中,您不需要为所有对象存储转换。这些转换已经应用于所有对象。但是在这个解决方案中,您需要在CPU上的c++代码中更新它们。不会有很多转换,所以它应该是有效的。