【发布时间】:2015-08-17 06:06:02
【问题描述】:
我想开始使用 VBO 来渲染我的模型,但我遇到了一个我无法解决的错误。我已经看到当人们忘记取消绑定缓冲区时会发生这种情况,但据我所知,我这样做是正确的。我会省去你的打印语句,但我也确定在我调用后有一个 openGL 错误 1281
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
在 drawMe() 函数中。我猜 1281 表示价值不高……但我不知道这意味着什么。如果您能看到发生了什么问题,请赐教。
我在模型对象的构造中将_vboID初始化为0。
_vboID = 0;
然后:
void model::genBuffers() {
if (_vboID == 0){
glGenBuffers(1, &_vboID);
float vertexData[numFaces*3*3]; // numFaces * 3 vertices per face * 3 dimensions per vertex
/* fill */
int i = 0;
Polyhedron::Halfedge_const_handle h;
for (Polyhedron::Facet_const_iterator faceIter = polyhedron.facets_begin(); faceIter != polyhedron.facets_end(); ++faceIter) {
CGAL::Point_3<Kernel> p1,p2,p3;
h = faceIter->halfedge();
p1 = h->vertex()->point();
p2 = h->next()->vertex()->point();
p3 = h->prev()->vertex()->point();
vertexData[i] = p1.hx(); i++;
vertexData[i] = p1.hy(); i++;
vertexData[i] = p1.hz(); i++;
vertexData[i] = p2.hx(); i++;
vertexData[i] = p2.hy(); i++;
vertexData[i] = p2.hz(); i++;
vertexData[i] = p3.hx(); i++;
vertexData[i] = p3.hy(); i++;
vertexData[i] = p3.hz(); i++;
}
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind Buffer
}
}
void model::drawMe() {
glBindBuffer(GL_ARRAY_BUFFER, _vboID); /* glError 1281 generated after this line?? */
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);<<std::endl;
glDrawArrays(GL_TRIANGLES, 0, numFaces*3); /* crashes here */
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
错误信息:
异常类型:EXC_BAD_ACCESS (SIGSEGV)
异常代码:0x0000000000000008 处的 KERN_INVALID_ADDRESS
0x8 附近的 VM 区域: --> __TEXT 0000000107ed3000-00000001081a9000 [2904K] r-x/rwx SM=COW /Users/USER/Documents/*/project_vVBO.app/Contents/MacOS/project_vVBO
线程 0 崩溃::调度队列:com.apple.main-thread
0 GLEngine 0x00007fff99088f9f gleRunVertexSubmitImmediate + 10223
1 GLEngine 0x00007fff98f558ce glDrawArrays_Exec + 626
【问题讨论】:
-
您确实需要错误检查。无处不在。
-
我在这些函数中的每次 openGL 调用后都有它,但我在帖子中删除了它。 Here is the whole file如果你想看看。
-
您是否可能(无意中)复制了
model对象?尝试在析构函数中设置断点,或者在其中添加一些日志记录,以验证缓冲区没有被删除。 -
@RetoKoradi 哇,我没有意识到我正在这样做。缓冲区正在被删除 -__- 非常感谢!!!
-
欢迎来到俱乐部!当人们将 OpenGL 对象包装在 C++ 类中时,这种情况经常发生。我在这里写了一个相当详细的答案:stackoverflow.com/questions/28929452/…。在这里:stackoverflow.com/questions/26665382/….
标签: c++ opengl exc-bad-access vbo cgal