具有多VAO的Opengl 2.0

具有多VAO的Opengl 2.0,opengl,vertex-array-object,Opengl,Vertex Array Object,我试着用两层图形来设置一个2d屏幕 1) 由白色实线构成的网格 2) 彩色方形瓷砖 以下是我的opengl代码: 设置网格 //glGenBuffers(1, &gridVAO); glGenVertexArrays(1, &gridVAO); // **updated** glBindVertexArray(gridVAO); glGenBuffers(2, gridVBO); glBindBuffer(GL_ARRAY_BUFFER, gridVBO[0]); glBu

我试着用两层图形来设置一个2d屏幕

1) 由白色实线构成的网格 2) 彩色方形瓷砖

以下是我的opengl代码:

设置网格

//glGenBuffers(1, &gridVAO); 
glGenVertexArrays(1, &gridVAO); // **updated**
glBindVertexArray(gridVAO);

glGenBuffers(2, gridVBO);

glBindBuffer(GL_ARRAY_BUFFER, gridVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gridPos), gridPos, GL_STATIC_DRAW);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, gridVBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gridColors), gridColors, GL_STATIC_DRAW);
glVertexAttribPointer(vColor, 3, GL_FLOAT, GL_FALSE, 0, 0);


glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(gridVAO);
glDrawArrays(GL_LINES, 0, girdVertexCount);
glBindVertexArray(0);
设置磁贴

// glGenBuffers(1, &tileVAO);
glGenVertexArrays(1, &tileVAO); //**updated**

glBindVertexArray(tileVAO);

glGenBuffers(2, tileVBO);

glBindBuffer(GL_ARRAY_BUFFER, tileVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(tilePos), tilePos, GL_STATIC_DRAW);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, tileVBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(tileColors), tileColors, GL_STATIC_DRAW);
glVertexAttribPointer(vColor, 3, GL_FLOAT, GL_FALSE, 0, 0);


glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
绘制瓷砖

glBindVertexArray(tileVAO);
glDrawArrays(GL_TRIANGLES, 0, TILE_COUNT_X * TILE_COUNT_Y * 6);
glBindVertexArray(0);
绘制网格

//glGenBuffers(1, &gridVAO); 
glGenVertexArrays(1, &gridVAO); // **updated**
glBindVertexArray(gridVAO);

glGenBuffers(2, gridVBO);

glBindBuffer(GL_ARRAY_BUFFER, gridVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gridPos), gridPos, GL_STATIC_DRAW);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, gridVBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gridColors), gridColors, GL_STATIC_DRAW);
glVertexAttribPointer(vColor, 3, GL_FLOAT, GL_FALSE, 0, 0);


glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(gridVAO);
glDrawArrays(GL_LINES, 0, girdVertexCount);
glBindVertexArray(0);
通过仅保留“设置+绘制栅格”,可以产生以下效果:

通过仅保留“设置+绘制平铺”,可以产生以下效果:

VAO本身工作正常

然而,魔法从这里开始:

如果我把

setup grid
setup tiles

// draw tiles
draw grid
它产生了以下结果:

看起来绘制网格代码从平铺的VAO中拾取缓冲区。请帮忙:D

更新:

在更正为
glgenvertexarray
后,同样的问题仍然发生

但我发现两个VAO都是0

cout<<"gridVAO "<<gridVAO<<endl;
cout<<"tileVAO "<<tileVAO<<endl;

为什么要用调用
glGenBuffers
生成的ID调用
glBindVertexArray
?看起来很可疑<代码>glgenvertexarray可能?;)@NicolasRepiquet所说的。@NicolasRepiquet是正确的:因为tileVAO和gridVAO是glBindVertexArray的无效ID,这些调用会抛出一个错误,什么也不做。因此,当您设置VAO时,网格和平铺都会修改默认VAO,这会导致这种奇怪的绘图行为。@Nicolasrepiquiet我切换到GlgenVertexArray,但问题仍然存在。调用GlgenVertexArray后,gridVAO和tileVAO==0?格雷罗怎么说?