【问题标题】:OpenGL Cube StructureOpenGL立方体结构
【发布时间】:2015-02-02 01:31:14
【问题描述】:

我是 OpenGL 的新手,也是 C++ 的新手。 我创建了一个 main.cpp,我在其中执行所有操作。我创建了一个 GLfloat data[],我在其中存储了我的 Cube 的顶点以及一个用于颜色的 GLfloat color[]。我创建了一个 VAO 和一个 VBO,并且我有一个方法,我在其中编译了一个简单的顶点和片段着色器。

问题是,我的代码很长,所以我想创建一个立方体类,三角形类等等。

我现在的问题是,我可以为多个对象使用相同的 VAO,还是为每个对象使用一个新的 VAO?。

另一件事是,我不完全知道如何编程。我缺少结构(我以前使用过 Java)。

我的想法是:

class Cube {
   public:
     Cube();
     Cube(GLfloat position[],GLfloat color[]);
     //But i need the same Shaders for each Object , so do i initialize it here or somewhere else?
     compileShader();
     drawCube();

}

请注意,这只是我的想法。也许有人可以帮助我解决这个问题:)

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    VAO 和 VBO 可以重复使用,但只有在它们不发生变化的情况下才能提高性能(例如,如果您保留一个 1x1x1 立方体但使用变换来绘制其他立方体)。

    对于小型应用程序中的简单立方体,您理想的结构应该是这样的

    class Cube{
      private static int vbo;
      private static int vao;
      public Cube(){
        //If vbo and vao are 0 initialize them here
      }
      public void render(mat4* transform){
      }
    }
    

    着色器将是一个单独的类,它可以是此对象public void render (mat4* transform, shader* shader) 的渲染调用的一部分,也可以由主管道调用。

    现在,我建议阅读 C++ 中的头文件。在 c++ 中,头文件是正确的开发方式,特别是如果您要围绕程序共享您的类。其他类只需要继承标头,它们不必关心实现,这样您的代码只编译一次,并且您在整个类中使用相同的编译汇编代码。 (在 c++ 中,如果你包含实际代码,它会被编译,即使现代链接器擅长合并重复代码,它仍然是不好的做法)

    立方体.h:

    class Cube{
      static int vbo;
      static int vao;
    public:
      Cube();
      void render(mat4* transform);
    }
    

    cube.cpp:

    Cube::Cube(){
      //Initialize Here
    }
    Cube::render(mat4* transform){
      //Render here
    }
    

    那么你还需要一对着色器 着色器.h:

    class Shader{
      int ProgramID;
    public:
      Shader();
      void activate ();
    }
    

    shader.cpp:

    Shader::Shader(){
      //compile shader here
    }
    Shader::activate(){
      //make this shader program active here
    }
    

    我提到的用于转换的 mat4 数据来自 http://glm.g-truc.net/0.9.6/index.html,这是一个用于处理 3D 图形数学的出色库。

    如果你想进一步重构,你可以在所有图形对象都继承的接口中定义立方体的渲染函数,让你更动态地实例化和配置对象,而不用关心它们是什么类型,只是它们是所需的接口。

    【讨论】:

    • 感谢您详细的回答 :) 这可能对我有帮助
    • @lolio 随时提出您的任何问题。我在 c++ 和 opengl 方面相对流利(尽管我在着色器方面有点过时)。只是好奇,您的目标是什么版本的 OpenGL?
    • 是的,肯定会有更多关于这个的问题;)我目前使用 opengl 4.3
    • 您的语法看起来更像 Java 而不是 C++。在 C++ 中,没有为每个方法指定访问修饰符。您编写一次访问修饰符,后跟一个冒号,然后是所有使用访问修饰符的声明。
    • 是的,我最近经常在两者之间跳来跳去。我会编辑,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2020-08-19
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多