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,而不关心它们是什么类型,只关心它们是所需的接口。
我是 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,而不关心它们是什么类型,只关心它们是所需的接口。