所以我一直在努力教自己使用VBO,以提高我的OpenGL项目的性能,并学习比固定功能渲染更高级的东西.但是我没有找到一个体面的教程方式; 到目前为止我发现的最好的是Songho的教程和OpenGL.org上的内容,但我似乎缺少某种背景知识来完全理解发生了什么,虽然我无法确切地知道它是什么我'没有得到,保存一些参数的使用.
在任何情况下,我都在前进并提出一些相似的代码,至少不会崩溃,但它会导致奇怪的结果.我要渲染的是这个(使用固定功能渲染;它应该是棕色的,背景为灰色,但我所有的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);
Run Code Online (Sandbox Code Playgroud)
然后将数据上传到缓冲区.请注意,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 …
Run Code Online (Sandbox Code Playgroud)