所以我一直在试图教自己使用VBOs,以提高我的OpenGL项目的性能,并学习比固定函数渲染更先进的东西。但我没有找到一个体面的教程的方式很多;到目前为止我发现的最好的是Songho's tutorials和OpenGL.org的东西,但我似乎错过了某种背景知识以充分理解发生了什么,但我无法确切知道它是什么,我没有得到,保存几个参数的用法。在任何情况下,我都已经伪造了,并且提出了一些至少不会崩溃的破解代码,但这会导致奇怪的结果。我想渲染的是这个(使用固定功能渲染;它应该是棕色和背景灰色,但是我所有的OpenGL屏幕截图似乎都采用洋红色作为他们最喜欢的颜色;也许是因为我使用SFML作为窗口?)。学会正确使用VBOs
我能得到什么,不过,是这样的:
我不知所措。下面是相关的代码我使用,首先为建立缓冲对象(我分配大量内存作为每this guy's建议拨出4-8MB):
GLuint WorldBuffer;
GLuint IndexBuffer;
...
glGenBuffers(1, &WorldBuffer);
glBindBuffer(GL_ARRAY_BUFFER, WorldBuffer);
int SizeInBytes = 1024 * 2048;
glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
SizeInBytes = 1024 * 2048;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
那么对于数据上传到缓冲区。请注意,CreateVertexArray()使用顶点数据在传递位置处填充矢量,每个顶点贡献3个浮点数用于位置,3个浮点数用于正常(关于各种教程最令人困惑的事情之一就是我应该存储的格式,并将我的实际在顶点数据,这似乎是一个体面的近似):
std::vector<float>* VertArray = new std::vector<float>;
pWorld->CreateVertexArray(VertArray);
unsigned short Indice = 0;
for (int i = 0; i < VertArray->size(); ++i)
{
std::cout << (*VertArray)[i] << std::endl;
glBufferSubData(GL_ARRAY_BUFFER, i * sizeof(float), sizeof(float), &((*VertArray)[i]));
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, i * sizeof(unsigned short), sizeof(unsigned short), &(Indice));
++Indice;
}
delete VertArray;
Indice -= 1;
后,在游戏圈,我用这个代码:
glBindBuffer(GL_ARRAY_BUFFER, WorldBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glNormalPointer(GL_FLOAT, 0, 0);
glDrawElements(GL_TRIANGLES, Indice, GL_UNSIGNED_SHORT, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
我会完全诚实的 - 我不是我确定我明白glVertexPointer()
和glNormalPointer()
应该是第三个参数(步幅是偏移量是由tes,但Songho在值之间使用0字节的偏移量 - 什么?),或者这两者中的最后一个参数是什么。初始值被认为是0;但它应该是一个指针。传递一个空指针以获得数组的第一个坐标/标准值似乎很奇怪。 This guy使用BUFFER_OFFSET(0)
和BUFFER_OFFSET(12)
,但是当我尝试时,我被告知BUFFER_OFFSET()未定义。
另外,中glDrawElements()
最后一个参数应该是一个地址,但同样,Songho如果我使用&IndexBuffer
而不是0使用的0地址,我得到了一个空白屏幕无任何渲染的地方,除了背景。
有人能够启发我,或者至少指向我的方向,这将帮助我弄清楚这一点吗?谢谢!
感谢您的批评和解释!我会修改我的代码,希望这次有更多的成功和理解。 – GarrickW