0

在 OpenGL 中绘制大量对象的技术

我想知道我可以使用哪些技术或方法在 OpenGL 上绘制许多对象。

例如,我可能有一个代表砖块的类,可能还有一个代表树的类,或者我想像灯柱一样绘制的其他随机事物。然后说,我有很多砖块要绘制,或者灯柱或类似的东西......为每个块​​调用一个绘制方法会导致很长的代码。

目前我正在使用 glut 回调函数来绘制世界上的“东西”,比如砖头或树。

使用可全局访问的基指针向量

我的一个想法是让所有类都从基类继承,并将基指针放入向量中 - 然后让向量全局。这样我可以做类似的事情:

for(int i = 0; i < vector_of_objects.size(); i ++)
    vector_of_objects[i]->draw();

每个对象都可以有一个绘制函数,该函数绘制所有 OpenGL 基元。

这种类的一个例子是这样的。(这是我一直在尝试的。)

class box {
    public:
        void draw() { // Do the drawing of a box }
    // Other members etc
}

备择方案?

这似乎不是一个好主意,因为为房子之类的东西创建一个新类,需要用户记住添加一个名为“draw”的绘图函数......虽然这是一个微不足道的问题,但不一定是大问题问题。

工业或游戏开发中是否使用了不同的技术?我看到这种方法的优点是,一旦将 for 循环放入 draw 函数中,您就可以忘记它 - 只需担心在全局可访问向量中放置更多项目(或指针)。

有人对更好的选择有什么建议吗?

4

3 回答 3

1

为您的 Stuff 创建一个接口并从中继承类。这样,没有人会忘记需要实现绘制方法。

于 2013-07-11T00:08:34.770 回答
0

它更复杂的问题:)

从 opengl 的角度来看,立方体、盒子、树……这些只是推到管道的三角形。你真的需要让他们分开吗?可能您需要但仅用于游戏/应用程序的逻辑,而不是用于渲染。

所以一般游戏中的对象可以这样声明:

class Object {
    Model3D m_mesh;
    PhysicsModel m_physicsModel;
    ...

    doStuff();
}

Model3D - 可能从某个文件加载的网格,包含三角形 + 材质 + 着色器 + 纹理等。它用于绘制对象。

PhysicsModel - 对象的物理表示,用于物理引擎。

从中您可以派生自己的对象。当您想要渲染整个对象时,您将m_mesh-es 推送到渲染队列

一般来说,你有一些实体+它的各种表示(渲染、物理)。

RenderQueue收集要渲染的网格,可以按材质(着色器、纹理等)对它们进行排序并进行高效渲染。它可以使用实例化、剔除技术等。

更新对象后,您会将它们添加到渲染队列:

for(int i = 0; i < vector_of_objects.size(); i++)
    rendering_queue->add(object[i].m_mesh);

然后在渲染代码中,您将调用:

rendering_queue->renderAll();

在此处查看有关数据驱动引擎的好处的精彩演示

于 2013-07-11T06:17:18.217 回答
0

创建一个包含用于呈现对象的纯虚函数的抽象基类。这会强制派生类实现函数,以便实例化。

class shape
{
public:
    virtual void draw( /* parameters */ ) = 0; // pure virtual

    // other member functions 
};

class box : public shape
{
public:
    virtual void draw( /* parameters same as in shape */ )
    {
        // rendering code goes here
    }
};

现在你可以像这样使用它......

std::vector<shape*> vector_of_objects;

for(int i = 0; i < vector_of_objects.size(); i ++)
    vector_of_objects[i]->draw( /* arguments */ );
于 2013-07-11T00:24:35.173 回答