OpenGL 立方体结构

OpenGL Cube Structure

我是 OpenGL 新手,也是 C++ 新手。 我创建了一个 main.cpp 来做所有事情。我创建了一个 GLfloat data[] 来存储我的立方体的顶点和一个 GLfloat color[] 来存储颜色。我创建了一个 VAO 和一个 VBO,并且我有方法,我在其中编译了一个简单的顶点和片段着色器。

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

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

另一件事是,我不知道如何编程 this.I'我缺少结构(我以前使用过 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();

}

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

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){
  }
}

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

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

Cube.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
}

那你还想要一对着色器 shader.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 图形数学的一个很好的库。

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