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

Drawing OpenGL中的对象绘制技术 OpenGL中绘制大量对象的技术,drawing,Drawing,我想知道我可以使用什么技术或方法在OpenGL上绘制许多对象 例如,我可能有一个代表砖块的类,也可能有另一个代表树的类,或者我想画一些随机的东西,比如灯柱。然后说,我有很多砖头要画,或者灯柱之类的东西。。。为每一个调用draw方法都会导致很长的代码 目前,我正在使用glut回调函数来绘制世界上的“东西”,比如砖块或树 使用全局可访问的基指针向量 我的一个想法是让所有的类都从一个基类继承,然后把基指针放到一个向量中,然后让这个向量是全局的。这样我可以做一些事情,比如: for(int i = 0;

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

例如,我可能有一个代表砖块的类,也可能有另一个代表树的类,或者我想画一些随机的东西,比如灯柱。然后说,我有很多砖头要画,或者灯柱之类的东西。。。为每一个调用draw方法都会导致很长的代码

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

使用全局可访问的基指针向量 我的一个想法是让所有的类都从一个基类继承,然后把基指针放到一个向量中,然后让这个向量是全局的。这样我可以做一些事情,比如:

for(int i = 0; i < vector_of_objects.size(); i ++)
    vector_of_objects[i]->draw();
选择? 这似乎不是一个好主意,因为为房子之类的东西创建一个新类需要用户记住添加一个名为“draw”的draw函数。。。虽然这是一个小问题,但不一定是一个大问题

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


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

为你的东西创建一个接口并从中继承类。这样,没有人会忘记需要实现draw方法。

创建一个抽象基类,其中包含用于渲染对象的纯虚函数。这将强制派生类实现该函数,以便对其进行实例化

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 */ );
std::向量对象的向量;
for(int i=0;idraw(/*参数*/);

这是一个更复杂的问题:)

从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);

请看这里关于

的精彩演示,这是一个好主意!我还可以使用该接口创建基指针。什么定义了接口?什么使它不同于类?接口是一种抽象描述。不能实例化接口。例如,您知道一只鸟可以飞,但由于鸟和鸟的种类很多,无法定义它的飞行。fly()。因此,您定义了一个名为Bird的接口,在其中声明其属性(成员)和方法。您也可以对类执行此操作,但这样做没有意义,因为draw()方法是抽象的,将在继承的类中实现。在这里阅读更多:好吧,这很有趣;什么是Model3D和PhysicsModel?另外,我该如何使用渲染队列呢?这会更好,因为它不会询问特定的编程问题。
for(int i = 0; i < vector_of_objects.size(); i++)
    rendering_queue->add(object[i].m_mesh);
rendering_queue->renderAll();