【发布时间】:2019-12-28 15:27:18
【问题描述】:
我有一些用于体素引擎的代码,它将块的外表面计算为一系列顶点、法线和纹理坐标数组,并将它们存储在 CPU 内存中,以便我可以绘制它们。
画完它们后,我将选定的脸像半透明的红脸一样画在一切之上。
它有效,但随着世界的发展,它变得缓慢;所以我开始做正确的事情,使用glGenBuffers 生成缓冲区。这也有效,但之后我画的那张脸就消失了。我也可能将其移至 GPU 缓冲区,但我想知道为什么会这样。
这大致是我用来从 CPU 内存中绘制的代码(它有效,并且它以红色显示选定的面):
// Drawing the world, this is repeated for each chunk
glVertexPointer(3, GL_FLOAT, 0, &mVertex[0]);
glNormalPointer(GL_FLOAT, 0, &mNormal[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &mTexture[0]);
glDrawArrays(GL_QUADS, 0, cVertex.size()/3);
// Drawing the selected face, face*12 or face*8 gives the correct index
glColor4f(1,0,0,0.2);
glVertexPointer(3, GL_FLOAT, 0, &boxVertex[face*12]);
glNormalPointer(GL_FLOAT, 0, &boxNormal[face*12]);
glTexCoordPointer(2, GL_FLOAT, 0, &boxTextureCord[face*8]);
glDrawArrays(GL_QUADS, 0, 4);
结果(无纹理):
这里我展示了从 GPU 内存中绘制的变化(选定的面停止渲染):
// Drawing the world, this is repeated for each chunk
// Buffers have been previously filled with mVertex, mNormal and mTexture
glBindBuffer(GL_ARRAY_BUFFER , mBuffers[0]);
glVertexPointer(3, GL_FLOAT, 0, nullptr);
glBindBuffer(GL_ARRAY_BUFFER , mBuffers[1]);
glNormalPointer(GL_FLOAT, 0, nullptr);
glBindBuffer(GL_ARRAY_BUFFER, mBuffers[2]);
glTexCoordPointer(2, GL_FLOAT, 0, nullptr);
glDrawArrays(GL_QUADS, 0, cVertex.size()/3);
// Drawing the selected face, face*12 or face*8 gives the correct index
glColor4f(1,0,0,0.2);
glVertexPointer(3, GL_FLOAT, 0, &boxVertex[face*12]);
glNormalPointer(GL_FLOAT, 0, &boxNormal[face*12]);
glTexCoordPointer(2, GL_FLOAT, 0, &boxTextureCord[face*8]);
glDrawArrays(GL_QUADS, 0, 4);
结果(无纹理):
所做的唯一更改是此处显示的更改以及调用 glGenBuffers 然后将缓冲区复制到 GPU 的代码。
【问题讨论】:
标签: opengl opengl-compat