OpenGL C++:VBO 的结构包装器不会初始化成员
OpenGL C++: Struct wrapper for VBO won't initialize members
我对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有一定的了解。
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员