Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用glpaureElements会导致访问冲突_C++_Visual Studio 2010_Opengl_Access Violation - Fatal编程技术网

C++ 调用glpaureElements会导致访问冲突

C++ 调用glpaureElements会导致访问冲突,c++,visual-studio-2010,opengl,access-violation,C++,Visual Studio 2010,Opengl,Access Violation,我目前正试图弄清楚VBO的东西是如何工作的,这会导致可怕的问题:/ im从.obj文件加载数据(请参阅:获取.obj文件) 并(试图)将其放入VBO中 我绑定数据的代码如下所示: //Generate Buffers glGenBuffers(1, &this->glVerticesBufferID); glGenBuffers(1, &this->glIndexBufferID); //bind the buffers to set the data glBind

我目前正试图弄清楚VBO的东西是如何工作的,这会导致可怕的问题:/

im从.obj文件加载数据(请参阅:获取.obj文件) 并(试图)将其放入VBO中

我绑定数据的代码如下所示:

//Generate Buffers
glGenBuffers(1, &this->glVerticesBufferID);
glGenBuffers(1, &this->glIndexBufferID);

//bind the buffers to set the data
glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
glBufferData(GL_ARRAY_BUFFER, this->verticesList.size() * sizeof(GLfloat), 0, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indexList.size() * sizeof(GLshort), 0, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, this->verticesList.size(), this->verticesList.data()); 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, this->indexList.size(), this->indexList.data()); 

//Clear binds 
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
最后,我用以下内容呈现所有内容:

glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, this->indexList.size(), GL_UNSIGNED_SHORT, this->indexList.data());
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
最后,我在VisualStudio 2010的输出中得到了访问冲突消息

0xC0000005:访问冲突读取位置0x0147fbd8

所以我的问题是 如何解决这个问题?(或者如果我错了怎么做才对)

---------------编辑1---------------

绑定数据

 glGenBuffers(1, &this->glVerticesBufferID);
 glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
 glBufferData(GL_ARRAY_BUFFER, (this->verticesList.size() + this->textureCoordList.size() + this->normalsList.size()) * sizeof(GLfloat), 0, GL_STATIC_DRAW);
 glBufferSubData(GL_ARRAY_BUFFER,
                0,
                this->verticesList.size() * sizeof(GLfloat),
                this->verticesList.data()
               );
 glBufferSubData(
                GL_ARRAY_BUFFER, 
                this->verticesList.size() * sizeof(GLfloat), 
                this->normalsList.size() * sizeof(GLfloat), 
                this->normalsList.data()
               );
 glBufferSubData(
                GL_ARRAY_BUFFER, 
                (this->verticesList.size() + this->normalsList.size()) * sizeof(GLfloat), 
                this->textureCoordList.size() * sizeof(GLfloat),
                this->textureCoordList.data()
               );
 glBindBuffer(GL_ARRAY_BUFFER, 0);

 glGenBuffers(1, &this->glIndexBufferID);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indexList.size() * sizeof(GLushort), this->indexList.data(), GL_STATIC_DRAW);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);



 pub_glVerticesBufferID = glVerticesBufferID;
 pub_glIndexBufferID = glIndexBufferID;
渲染部分:

 glBindBuffer(GL_ARRAY_BUFFER, this->glVerticesBufferID);
 glVertexPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), (GLvoid*)0);
 glNormalPointer(GL_FLOAT, 3 * sizeof(GLfloat), (GLvoid*)(this->verticesList.size() * sizeof(GLfloat)));
 glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), (GLvoid*)((this->normalsList.size() + this->verticesList.size()) * sizeof(GLfloat)));
 glBindBuffer(GL_ARRAY_BUFFER, 0);

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->glIndexBufferID);
 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

您可能没有初始化OpenGL-1.1之后引入的功能的入口点。在Windows中,仅指定OpenGL-1.1入口点,所有超出该入口点的内容都必须在运行时初始化。否则您将获得访问冲突。看看GLEW,它提供了一种简便的方法,只需3行代码就可以完成这项繁琐的任务

尽管如此,您的代码仍然存在错误:

您需要告诉OpenGL它应该从缓冲区中提取元素的确切位置。这是通过调用
gl…Pointer
函数来实现的,数据元素是缓冲区中的字节偏移量。你的代码忽略了这一点。此外,
glpaurements
不再需要指针放置偏移量


但是当缓冲区对象被绑定时,这不应该导致segfault/访问冲突。

您的意思是
glvertexpinter
?我已经在代码中使用了该函数,但在多次尝试后将其删除,希望这可能是问题所在:/@X39:是的,你必须调用它,否则OpenGL怎么知道从哪里获取数据?但是,如果绑定了VBO,则不应出错(但是,如果没有绑定VBO,则会这样做)。无论如何,你对GLDrawerElements的调用是错误的,因为一个VBO被绑定了,你没有给出一个指针,而是给绑定的元素数组VBO一个偏移量。。。我在很多页上读到,我只需要将最后一个参数留空就可以让它工作:/那么如何获得哪个偏移量呢?如果您可以指定它将非常有用(也可以节省我一些搜索时间来获取它)@X39:“Empty”和0/NULL是非常不同的事情。我举了一个小小的VBO示例,我建议你仔细阅读它的代码,试着理解它的功能,如果有任何问题,请与我联系。谢谢你,当我回到家时,我会检查一下(这就是我说空的时候说的:/有时我对这些话不够仔细)