DirectX 9中面向对象渲染框架的一般方法?

时间:2012-02-18 17:07:28

标签: c++ directx

我正在用C ++和DirectX 9编写图形引擎,我打算在稍后的游戏中使用它。前段时间,我在OpenGL中编写了一个功能齐全的2D引擎和一个基本的3D引擎,但现在我决定在DirectX 9中开始一个新项目。

在之前的引擎中,我创建了std::vector类型Entity,其中可能包含TankWeaponParticle等子类型。我会然后,通过多态,做“for each Entity in std::vector do Entity->Draw()”之类的事情。绘制函数将执行glVertex3f(...)

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

1 个答案:

答案 0 :(得分:0)

这取决于你的目标是什么,如果你想要效率,你可以在std::unordered_map中加载带有关联句柄的网格,对于纹理也是如此,那么这将允许你实例化相同对象类型的向量

如果你想让它更简单,你可以创建一个容器来存储所有实体和你需要的渲染信息(类似于你的'旧'引擎),尽管也可能想要使用剔除数据结构(比如Octree):

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);
    }
}

此处std::shared_ptr<RenderInfo>对于VB / IB对是唯一的,以避免不必要的重复