c++ - OpenGL C++ : Struct wrapper for VBO won't initialize members

标签 c++ opengl struct constructor

我是 OpenGL 的新手,并且一直在通过一些在线教程来熟悉 API。我了解 VBO 的创建过程是这样的:

GLuint vboID;                                                        
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticesArray), verticesArray, GL_STATIC DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

并且,在声明任何给定的 VBO 之前,我创建了一个 VAO 并绑定(bind)它。目前,我正在为每个 VAO 制作一个 VBO。

我想在 API 之上做一些包装器工具,这样创建 VBO 和 VAO 之类的事情就变得更加方便。

我已经开始创建一个结构,它将在其构造函数中获取一个顶点数组并从中创建一个 VBO。我将其命名为“triVBO”,只是因为我现在只创建“GL_TRIANGLES”对象。

“triVBO”结构定义如下:

struct triVBO {
GLuint ID = 0;
const void* data = (void*)0;
GLsizeiptr verticeCount = 0;
GLsizeiptr triCount = 0;

triVBO(const void* _data) {
    //VBO generation
    GLuint vboID;
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(_data), _data, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    //do our assigning
    data = _data;
    ID = vboID;
    verticeCount = (sizeof(data) / sizeof(GLfloat)) / 3;
    triCount = verticeCount / 3;
}
};

一切正常运行和编译。然而,问题出在“verticeCount”和“triCount”成员的赋值上。

正如你在构造函数中看到的,参数是一个“const void*”,我使用它是因为,在检查“glBufferData()”的第三个参数的类型时,第三个参数是你传入的数组到宏以及我试图传递给我的构造函数的数组,我看到它是一个“const void*”,我认为我应该使用适用于宏的相同类型。

我在整个构造函数和主程序中添加了一些 DEBUG 宏,我已从该示例中删除这些宏,以便于阅读。当我运行其中包含这些 DEBUG 宏的程序时,这就是我得到的。

当我调用它时:

triVBO tv_pyrVBO(pyramidVerts);
DEBUG("pyramidVerts: ", pyramidVerts);
DEBUG("tv_pyrVBO.data: ", tv_pyrVBO.data);
DEBUG("tv_pyrVBO.ID: ", tv_pyrVBO.ID);
DEBUG("tv_pyrVBO.verticeCount: ", tv_pyrVBO.verticeCount);
DEBUG("tv_pyrVBO.triCount: ", tv_pyrVBO.triCount);

控制台打印如下:

pyramidVerts: 00007FF603EFC4C0
tv_pyrVBO.data: 00007FF603EFC4C0
tv_pyrVBO.ID: 2 
tv_pyrVBO.verticeCount: 0
tv_pyrVBO.triCount: 0

据我所知,我试图在构造函数中分配数组“pyramidVerts”的“数据”成员正在正确分配,因为地址相同。此外,缓冲区生成和绑定(bind)的代码可以正常工作,因为“ID”被正确分配了一个值 2(我在程序中已经有一些其他 VBO,这就是它不是 1 的原因)。只是“verticeCount”和“triCount”成员,您可以在构造函数中看到它们的计算,没有被正确分配,因为它们的值都是 0,但是对于这个特定的数组,它们的值应该是 18和 6,分别。

错误是什么?我是否使用了错误的类型来传递数组或保存“verticeCount”和“triCount”的信息? OpenGL API 中是否有我遗漏或使用不当导致无法分配的内容?我是否在 C++ 或一般编程方面犯了一个非常明显的错误?我已经搜索了几个小时,但我找不到真正回答我的具体问题的 stackoverflow 或 quora 或 cplusplus 答案。

我们将不胜感激任何帮助或指导,也欢迎您提供任何额外的 GL 技巧。谢谢!

最佳答案

It's just that the "verticeCount" and "triCount" members, whose calculations you can see in the constructor, aren't being assigned properly

Am I making a super obvious mistake of C++ or programming in general?

是的。 sizeof 不是那样工作的。采用另一个定义输入大小的参数并使用它,或者更好的是,采用 std::vector 或其他知道其大小的标准容器。

我建议您在深入了解包装 OpenGL API 之前先熟悉基本的 C++ 概念,因为正确地做到这一点需要对您正在使用的语言和 API 有一定的了解。

关于c++ - OpenGL C++ : Struct wrapper for VBO won't initialize members,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44390431/

相关文章:

c++ - 为什么 OpenGL GLFW 渲染形状不起作用?

c++ - 很多变量,没有嵌套循环的最佳方法

c++ - protobuf中的路径

java - 我可以在我的 Java 应用程序中使用 OpenGL 吗?如果是,如何?

c++ - 在面向对象程序中使用 GLUT

c++ - undefined object 引用

c++ - 如何与命令 ld 链接

c++ - 从基结构虚拟继承

c# - .NET 类型的私有(private)成员的命名约定

struct - 是否有用于构造包含对临时对象的引用的结构的单行语法?