gpt4 book ai didi

c++ - OpenGL 立方体结构

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:15 25 4
gpt4 key购买 nike

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

问题是,我的代码很长,所以我想创建一个Cube类,Triangle类等等。

我现在的问题是,我可以对多个对象使用相同的 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();

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

最佳答案

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

立方体.h:

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

立方体.cpp:

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

然后你还想要一对着色器着色器.h:

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

着色器.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 图形数学的一个很棒的库。

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

关于c++ - OpenGL 立方体结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28262992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com