OpenGL C++:VBO 的结构包装器不会初始化成员

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

本文关键字:初始化 成员 包装 结构 C++ VBO OpenGL      更新时间:2023-10-16

我对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并绑定它。在此时间点,我正在为每一个VAO做一个VBO。

我想在API之上制作一些包装工具,以便诸如创建VBO和VAOS之类的事情变得更加方便。

我已经开始创建一个结构,该结构将在其构造函数中占据一系列顶点并从中创建一个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"answers" Tricount"成员的分配。

如您在构造函数中所看到的,参数是" const void*",我使用的是因为在检查" glbufferdata(("的第三个参数的类型后,第三个参数是您传递的数组到宏,因此我要试图传递给构造函数的数组,我看到它是" const void*",我认为我应该使用适用于宏的相同类型。

我已经在整个构造函数和主要程序中制作了一些调试宏,这些调试宏已从该示例中删除,以便易于阅读。当我使用其中的这些调试宏来运行程序时,这就是我得到的。

当我打电话时:

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

根据我可以说的"数据"成员,在构造函数中,我试图分配数组"金字管",因为地址是相同的。同样,缓冲区生成和绑定的代码作用是因为" ID"正确分配了2个(我已经在程序中还有其他一些VBO,这就是为什么它不是1(。只是" VerticeCount"answers" Tricount"成员,您可以在构造函数中看到其计算,但没有正确分配,因为它们俩的值为0,但是有了这个特定的数组,它们应该具有18个值和6分别。

错误是什么?我是在使用错误的类型传递阵列还是保存" VerticeCount"answers" Tricount"的信息?我缺少的OpenGL API中是否有某些内容导致其未分配的东西?我是否犯了C 或编程的绝对明显错误?我已经搜索了几个小时,但我无法遇到真正回答我的特定问题的stackoverflow,Quora或Cplusplus答案。

任何帮助或方向都将不胜感激,您想提供的任何额外的GL技巧也受到欢迎。谢谢!

只是" VerticeCount"answers" tricount"您可以在构造函数中看到的计算成员未正确分配

我是犯了C 或编程一般的超级明显错误?

是。sizeof无法正常工作。采用另一个参数定义输入的大小并使用该参数,或者更好地使用std::vector或其他知道其大小的标准容器。

我建议在您深入培训OpenGL API之前熟悉基本的C 概念,因为正确执行此操作将需要对您使用的语言和API有一定的了解。