【问题标题】:General approach for object oriented rendering framework in DirectX 9?DirectX 9中面向对象渲染框架的一般方法?
【发布时间】:2012-02-19 02:57:00
【问题描述】:

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

在我以前的引擎中,我创建了一个Entity 类型的std::vector,它可以包含TankWeaponParticle 等子类型。然后,我会通过多态性做一些类似'@ 987654326@'。绘图函数会做glVertex3f(...)

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

【问题讨论】:

    标签: c++ directx


    【解决方案1】:

    这取决于你的目标是什么,如果你想要效率,你可以在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&lt;RenderInfo&gt; 对VB/IB 对来说是唯一的,以避免不必要的重复

    【讨论】:

    • 假设我将实施您解决问题的简单方法(然后可能在稍后阶段实例化相同的对象)。你会在 Entity 的 Draw 函数中做什么?将其顶点复制到 VB 中,调用 DrawPrimitives() 并为实体向量中的每个实体清空 VB?
    • 您应该为每个不同的网格保留一个 vb 和一个 ib。只需在渲染前激活正确的。不要更改它们的内容。显卡针对静态 vb/ib 进行了优化。通过更改 vb/ib 的内容,您会在 GPU 和 CPU 之间产生大量流量。
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2012-04-26
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多