DirectX 9中面向对象渲染框架的通用方法? 我在C++和DirectX 9中编写了一个图形引擎,我打算在以后的游戏中使用它。不久前,我在OpenGL中编写了一个功能齐全的2D引擎和一个基本的3D引擎,但现在我决定在DirectX 9中启动一个新项目

DirectX 9中面向对象渲染框架的通用方法? 我在C++和DirectX 9中编写了一个图形引擎,我打算在以后的游戏中使用它。不久前,我在OpenGL中编写了一个功能齐全的2D引擎和一个基本的3D引擎,但现在我决定在DirectX 9中启动一个新项目,c++,directx,C++,Directx,在我以前的引擎中,我创建了一个类型为Entity的std::vector,它可以包含坦克、武器、粒子等子类型。然后,通过多态性,我将执行类似于“std::vector do Entity->Draw”中的每个实体的操作。draw函数将执行glVertex3f 现在我的问题是:如何在DirectX 9中实现类似的面向对象框架?我想为每种类型的坦克保留一个顶点数组,武器从文件中加载,将所有对象的所有顶点复制到同一个顶点缓冲区,然后为每个顶点子集调用DrawPrimitive。这是正确的方法吗?或者应

在我以前的引擎中,我创建了一个类型为Entity的std::vector,它可以包含坦克、武器、粒子等子类型。然后,通过多态性,我将执行类似于“std::vector do Entity->Draw”中的每个实体的操作。draw函数将执行glVertex3f


现在我的问题是:如何在DirectX 9中实现类似的面向对象框架?我想为每种类型的坦克保留一个顶点数组,武器从文件中加载,将所有对象的所有顶点复制到同一个顶点缓冲区,然后为每个顶点子集调用DrawPrimitive。这是正确的方法吗?或者应该为场景中的不同对象创建不同的顶点缓冲区(例如)?一些伪代码可以很好地说明正确的实现。

这取决于你的目标是什么,如果你想提高效率,你可以在一个std::unordered_贴图中加载你的网格,该贴图带有一个相关的句柄,对于纹理也是一样的,然后这将允许你引用相同对象类型的向量

如果你想让它更简单,你可以创建一个容器来存储所有的实体和所需的渲染信息,类似于你的“旧”引擎,尽管威尔可能希望使用剔除数据结构,就像:


这里std::shared_ptr对于VB/IB对来说是唯一的,以避免不必要的重复

假设我将实现解决问题的简单方法,然后可能在稍后阶段实例化相同的对象。在实体的绘图功能中,您将执行什么操作?将其顶点复制到VB,调用DrawPrimitives并清空实体向量中每个实体的VB?您应该为每个不同网格保留一个VB和一个ib。只需在渲染之前激活正确的。不要改变它们的内容。图形卡针对静态vb/ib进行了优化。通过更改vb/ib的内容,可以在GPU和CPU之间生成大量通信量。
class RenderInfo
{
    IDirect3DVertexBuffer9* pVertex;
    IDirect3DIndexBuffer9* pIndex;
    //...
};

class EntityController
{
    std::vector<std::pair<Entity,std::shared_ptr<RenderInfo>>> Entities;
    void Draw()
    {
        foreach e in Entities
            e.first.Draw(e.second);
    }
}