我是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和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”,正在正确分配,因为地址是相同的。此外,缓冲区生成和绑定的代码工作,因为“ID”被正确分配值2(我已经在程序中有一些其他的VBO,这就是为什么它不是1)。只是“verticeCount”和“triCount”成员,你可以在构造函数中看到它们的计算,没有被正确分配,因为它们的值都是0,但是对于这个特定的数组,它们的值应该是18。和6,分别。
错误是什么?我使用错误的类型来传递数组或保存“verticeCount”和“triCount”的信息吗? OpenGL API中是否存在我丢失或使用不正确导致无法分配的内容?我是否犯了C ++或编程的一个超级明显的错误?我已经搜索了几个小时,我无法遇到一个真正回答我具体问题的stackoverflow或quora或cplusplus答案。
我们非常感谢您提供任何帮助或指导,也欢迎您提出任何额外的GL提示。谢谢!
答案 0 :(得分:2)
只是" verticeCount"和" triCount"成员,你可以在构造函数中看到的计算,没有被正确分配
我是否犯了一个非常明显的C ++或编程错误?
是。 sizeof
并非如此。使用另一个参数来定义输入的大小并使用它来代替,或者更好地使用std::vector
或其他知道其大小的标准容器。
我建议您在开始包装OpenGL API之前熟悉基本的C ++概念,因为正确地执行此操作需要您熟悉语言和您正在使用的API。