我是OpenGL的新手,也是C ++的新手。
我创建了一个main.cpp,在那里我做了所有事情。我创建了一个GLfloat data[]
,其中我存储了我的多维数据集的顶点,还有一个GLfloat color[]
用于颜色。我创建了一个VAO和一个VBO,我有方法,我编译一个简单的顶点和片段着色器。
问题是,我的代码很长,所以我考虑创建一个Cube类,三角类等等。
我的问题是,我可以为多个对象使用相同的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();
}
请注意,这只是我对此的想法。也许有人可以帮助我解决这个问题:)
答案 0 :(得分:2)
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 ++中如果包含实际代码,它会被编译,即使现代链接器很好地合并重复代码,它仍然是不好的做法)
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图形数学的好库。
如果你想进一步重构,可以在所有图形对象都将继承的接口中定义cube的render函数,允许你更动态地实例化和配置对象,而不关心它们是什么类型,只是他们是所需的接口。