Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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 OpenGL不一致vbo上传_C_Opengl - Fatal编程技术网

C OpenGL不一致vbo上传

C OpenGL不一致vbo上传,c,opengl,C,Opengl,我正在Windows10中编写OpenGL3.3C应用程序。我大部分时间都在工作。有时,网格的vbo无法保存正确的数据。其他时候,确实如此。代码中没有任何更改 我尝试重新启动计算机并更新了图形驱动程序。我已经在RenderDoc中运行了它,以确保按照正确的顺序进行操作 glGenVertexArrays(1, &mesh->vao); glBindVertexArray(mesh->vao); glGenBuffers(1, &mesh->verts); gl

我正在Windows10中编写OpenGL3.3C应用程序。我大部分时间都在工作。有时,网格的vbo无法保存正确的数据。其他时候,确实如此。代码中没有任何更改

我尝试重新启动计算机并更新了图形驱动程序。我已经在RenderDoc中运行了它,以确保按照正确的顺序进行操作

glGenVertexArrays(1, &mesh->vao);
glBindVertexArray(mesh->vao);

glGenBuffers(1, &mesh->verts);
glBindBuffer(GL_ARRAY_BUFFER, mesh->verts);

glBufferData(GL_ARRAY_BUFFER, sizeof(float) * data->vertCount * 2, &data->verts[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);

glGenBuffers(1, &mesh->ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * data->indicieCount, &data->indicies[0], GL_STATIC_DRAW);
然后进行渲染。请注意,渲染->网格[i]->计数已设置为标记计数

glBindVertexArray(render->meshes[i]->vao);
glEnableVertexAttribArray(0);

glDrawElements(GL_TRIANGLES, render->meshes[i]->count, GL_UNSIGNED_INT, NULL);

顶点和标记数据应正确上传并存储到OpenGL。在RenderDoc中查看时,vbo数据部分/完全不正确。在手工打印数据以验证传入数据之前,我有一些for循环。上传前数据总是正确的。

我认为@rabbi76的想法是正确的。尽管我的C函数可以访问数据缓冲区,但OpenGL并不总是可以访问。将数据从原始数据缓冲区复制到新的数据缓冲区(在C函数内部分配)修复了该问题

编辑:
尽管C缓冲区显示正确,但缓冲区本身在上传时已释放。

数据是否真实呈现正确?这并不能以任何方式回答您的问题,但“indicie”不是正确的词。单数是“索引”,复数是“索引”,即数据->索引计数或数据->索引。@Rabbi76是的,我刚刚读过。@JeremyMoyes初始化
data->verts
data->indicies
时,动态内存的访问可能超出了范围。发布的代码看起来不错,这些是整个程序中唯一的缓冲区吗?如果没有,您能否确保在初始化后手动解除VAO的绑定,然后再解除VBO+IBO的绑定?
渲染->网格[i]->计数是否等于
数据->指示计数
?没有更多的代码,我就没有更好的了。您真的确定在调用之前
data->verts
是正确的吗?