OpenGL VBO EXC_BAD_ACCESS Crash
OpenGL VBO EXC_BAD_ACCESS Crash
我想开始使用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)异常代码:KERN_INVALID_ADDRESS at 0x0000000000000008
VM region Near 0x8:-->__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 glerunvertexsubmitimmid + 10223
1 GLEngine 0x00007fff98f558ce glDrawArrays_Exec + 626
已解决
我没有意识到我正在复制"model"对象,这会导致调用解构器并删除我创建的缓冲区。
model::~model()
{
if (_vboID != 0)
glDeleteBuffers(1, &_vboID);
}
非常感谢@RetoKoradi让我注意到这一点
相关文章:
- clCreateFromGLBuffer crash
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- Protobuf ShortDebugString() crash
- Simulink "Access Violation"写入 C++ lambda 函数捕获列表中的 PWork 变量
- Crash in boost::archive::text_iarchive in_archive {is} boost
- Qt QXmlStreamReader Access Violation
- "Access is Denied" U盘上的创建文件()
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- OpenCV Native Android cvtColor crash
- 例外:'Access violation reading location'
- 向量数组"Cannot access memory at address"
- 通过调用 CreateRemoteThread 来弹出 dll:crash
- Windeployqt不会运行,"Access is denied."
- 我在发布模式下运行时收到"Access violation reading location"错误 - C++
- Access C++ Enum from Swift
- Java 本机访问代码错误:"Invalid memory access"
- 如何获得私人会员的"read access"?
- 将数据添加到 CArray 会产生错误"cannot access private member declared in class 'CObject'"