所以我一直在尝试自学使用VBO,以提高我的OpenGL项目的性能并学习比固定功能渲染更高级的东西。但是我没有找到很好的教程;到目前为止我找到的最好的教程是Songho's tutorials和OpenGL.org上的内容,但似乎我缺少一些背景知识才能完全理解正在发生的事情,虽然我无法确定我没有理解的确切内容,除了一些参数的用法。
在任何情况下,我继续前进,并编写了一些被拼凑起来的代码,至少不会崩溃,但会导致奇怪的结果。我想要渲染的是这个(使用固定功能渲染;它应该是棕色的,背景是灰色的,但我的所有OpenGL截图似乎都采用洋红色作为它们最喜欢的颜色;也许是因为我使用SFML作为窗口?)。
我坦率地说 - 我不确定
在任何情况下,我继续前进,并编写了一些被拼凑起来的代码,至少不会崩溃,但会导致奇怪的结果。我想要渲染的是这个(使用固定功能渲染;它应该是棕色的,背景是灰色的,但我的所有OpenGL截图似乎都采用洋红色作为它们最喜欢的颜色;也许是因为我使用SFML作为窗口?)。
我很困惑。这是我使用的相关代码,首先是为了设置缓冲区对象(我分配了大量内存,根据这个人的建议分配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()
的第三个参数应该是什么(步长是字节偏移量,但Songho在值之间使用了0字节的偏移量 - 什么?),或者这两者的最后一个参数是什么。初始值被称为0;但它应该是一个指针。传递空指针以获取数组的第一个坐标/法线值似乎很奇怪。This guy使用BUFFER_OFFSET(0)
和BUFFER_OFFSET(12)
,但当我尝试时,我被告知BUFFER_OFFSET()未定义。
此外,glDrawElements()
的最后一个参数应该是一个地址,但同样,Songho使用地址0。如果我使用&IndexBuffer
而不是0,则什么都没有渲染,只有背景。
有人能为我解惑,或者至少指点我一些东西帮助我弄清楚吗?谢谢!