DirectX 9中面向对象渲染框架的通用方法

General approach for object oriented rendering framework in DirectX 9?

本文关键字:方法 框架 面向对象 DirectX      更新时间:2023-10-16

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

在我以前的引擎中,我制作了一个Entity类型的std::vector,它可以包含TankWeaponParticle等子类型。然后,通过多态性,我会做一些类似"for each Entity in std::vector do Entity->Draw()"的事情。draw函数将执行glVertex3f(...)

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

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

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

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对是唯一的,以避免不必要的重复