DirectX 9中面向对象渲染框架的通用方法
General approach for object oriented rendering framework in DirectX 9?
我正在用C++和DirectX 9编写一个图形引擎,我打算稍后在游戏中使用它。前段时间,我用OpenGL编写了一个功能齐全的2D引擎和一个基本的3D引擎,但现在我决定用DirectX 9启动一个新项目。
在我以前的引擎中,我制作了一个Entity
类型的std::vector
,它可以包含Tank
、Weapon
、Particle
等子类型。然后,通过多态性,我会做一些类似"for each Entity in std::vector do Entity->Draw()
"的事情。draw函数将执行glVertex3f(...)
。
现在我的问题是:如何在DirectX 9中实现类似的面向对象框架?我想为从文件加载的每种类型(Tank
、Weapon
)保留一个顶点数组,将所有对象的所有顶点复制到同一个顶点缓冲区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对是唯一的,以避免不必要的重复
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- C++ Console::WriteLine()-like 方法,没有 .net 框架
- C++ - QT 框架 / 无法调用方法
- 使用Windows生物识别框架或任何其他方法通过.Net访问指纹读取器
- 有选择地编译框架C++的方法
- 使用 Google C++ 模拟框架 (Google Mock) (V1.5) 将任意参数传递给调用的方法
- DirectX 9中面向对象渲染框架的通用方法
- 有没有任何方法可以在C++中导致整个堆栈框架展开?(使用异常除外)
- 有什么方法可以让谷歌测试框架与Visual Studio 6协同工作吗
- 能够模拟非虚拟方法和C函数的C++模拟框架
- 是否有一种方法可以从VS环境之外的MS单元测试框架中获取信息
- 谷歌测试框架:最好使用阴影或虚拟方法