gpt4 book ai didi

c++ - 多个对象,不同的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:44 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

ID3D11DeviceContext::Draw(VertexCount,StartVertexLocation)

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

最后,还有一种解决方案可以让您一次调用就可以渲染所有内容,即将所有对象存储在一个缓冲区中,方法与上一个示例相同。然而,这一次,每次对象移动、创建或销毁时,您都需要更新此缓冲区。在此解决方案中,您不存储所有对象的转换。这些转换已应用于所有对象。但在此解决方案中,您需要在 CPU 上的 C++ 代码中更新它们。不会进行很多转换,因此它应该是高效的。

关于c++ - 多个对象,不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25208821/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com