我正在用C ++和DirectX 9编写图形引擎,我打算在稍后的游戏中使用它。前段时间,我在OpenGL中编写了一个功能齐全的2D引擎和一个基本的3D引擎,但现在我决定在DirectX 9中开始一个新项目。
在之前的引擎中,我创建了std::vector
类型Entity
,其中可能包含Tank
,Weapon
,Particle
等子类型。我会然后,通过多态,做“for each Entity in std::vector do Entity->Draw()
”之类的事情。绘制函数将执行glVertex3f(...)
。
现在我的问题是:如何在DirectX 9中实现类似的面向对象框架?我正在考虑为从文件加载的每个类型(Tank
,Weapon
)保留一个顶点数组,将所有对象的所有顶点复制到同一个顶点缓冲区,然后调用{{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对是唯一的,以避免不必要的重复