具有多VAO的Opengl 2.0
我试着用两层图形来设置一个2d屏幕 1) 由白色实线构成的网格 2) 彩色方形瓷砖 以下是我的opengl代码: 设置网格具有多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
//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?格雷罗怎么说?