Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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++ C++;顶点缓冲区问题_C++_Opengl_Vbo - Fatal编程技术网

C++ C++;顶点缓冲区问题

C++ C++;顶点缓冲区问题,c++,opengl,vbo,C++,Opengl,Vbo,我正在尝试将顶点缓冲区添加到程序城市生成程序的Mesh.cpp文件中。当前代码的一部分如下所示: for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) { glBegin (GL_QUAD_STRIP); for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) { glTexCoord2fv (&_v

我正在尝试将顶点缓冲区添加到程序城市生成程序的Mesh.cpp文件中。当前代码的一部分如下所示:

for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) {
  glBegin (GL_QUAD_STRIP);
  for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) {
    glTexCoord2fv (&_vertex[*n].uv.x);
    glVertex3fv (&_vertex[*n].position.x);
  }
    glEnd ();
}
for(qsi=_quad_strip.begin();qsi<_quad_strip.end();++qsi){
glBegin(GLU四条带);
对于(n=qsi->index_list.begin();nindex_list.end();++n){
glTexCoord2fv(&_顶点[*n].uv.x);
glVertex3fv(&_顶点[*n].position.x);
}
格伦德();
}
这会将纹理绘制到某些建筑的矩形边上。我刚从网上找到的VBO教程中走出来,我尝试将其转换为使用顶点缓冲区,如下所示(我将vboId存储在Mesh.h中):

for(qsi=_quad_strip.begin();qsi<_quad_strip.end();++qsi){
void*varray=(char*)malloc(sizeof(GLfloat)*5*qsi->index_list.size());
GLfloat*p=(GLfloat*)varray;
int计数器=0;
对于(n=qsi->index_list.begin();nindex_list.end();++n){
memcpy(&p[counter+0],&_顶点[*n].uv.x,sizeof(GLfloat)*2);
memcpy(&p[计数器+2],&_顶点[*n]。位置x,大小f(GLfloat)*3);
计数器+=5;
}
glGenBuffersARB(1,&vboId);
glBindBufferARB(GL_数组_BUFFER_ARB,vboId);
glBufferDataARB(GL_数组_BUFFER_ARB,sizeof(GLfloat)*5*qsi->index_list.size(),p,GL_STATIC_DRAW_ARB);
glEnableClientState(GL_纹理_坐标_阵列);
glEnableClientState(GL_顶点_数组);
glTexCoordPointer(2,GL_FLOAT,sizeof(GLfloat)*5,(GLfloat*)0);
glVertexPointer(3,GLU浮动,大小为(GLfloat)*5,(GLfloat*)2);
gldrawArray(GL_QUAD_STRIP,0,qsi->index_list.size());
glBindBufferARB(GL_数组_BUFFER_ARB,0);
glDisableClientState(GL_纹理_坐标_数组);
glDisableClientState(GL_顶点_数组);
自由(瓦雷);
}

然而,这段代码根本不起作用。没有渲染任何内容。有时,当我将参数混入glTexCoordPointer或glVertexPointer中时,我确实扭曲了屏幕上绘制的数据(或程序崩溃),但没有任何数据接近远程工作。

您的顶点指针错误。使用VBOs时,指针被解释为相对于当前绑定缓冲区的字节偏移量。因此,需要sizeof(GLfloat)*2字节作为偏移量

glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5,  (char*)0 +sizeof(GLfloat)*2);

作为旁注:如果要创建具有正确大小但
NULL
作为数据指针(基本上创建数据存储)的VBO,并将其与
glMapBuffer()
进行内存映射,则可以保存额外的数据副本,完全避免
malloc()
ed您使用的临时缓冲区。

在每次循环迭代中使用新的缓冲区有点不符合目的。而且,由于VBO内存正在快速泄漏,因此在几帧后,这将失败。我正计划先让它工作,然后再将其移到循环外。事情是,您的数据已经完全按照单个VBO的需要进行了布局。您只需将整个
\u顶点
数组发出咕噜声即可。然后使用将
n
索引列表传递到
glDrawArrays
。事实上,现在看起来您正在重新排列顶点数据以使其连续,然后传递一组不连续的索引--结果不会很好。哦,对不起。您要将索引传递给的是
glpaurements
glDrawArrays
希望数据按顺序排列。非常感谢!这就解决了!我真希望我能早点把这件事发出来,这样会省去我一大堆麻烦:)我还会研究一下如何使用glMapBuffer()。
2+(GLfloat*)0
?@BenVoigt:好吧,如果你更喜欢的话。为什么不
2[(GLfloat*)0]
?2+(GLfloat*)0的工作原理也很有趣。我想有很多事情我都没能尝试。2[(GLfloat*)0]不能为我编译。@Brutalisk:是的,我的错。实际上,它会试图解除对指针的限制&2[(GLfloat*)0]应该编译,但我不建议使用这种废话。
glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5,  (char*)0 +sizeof(GLfloat)*2);