如何获得VBO的工作

我试图使用这个教程http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45

我加载它在我的Visual Studio 2008,编译它,它说缺less的文件:“GLES / glplatform.h”所以我谷歌文件…然后它呜呜声丢失文件:“KHR / khrplatform.h”,所以我谷歌那也是…然后它呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜,

我不知道从哪里开始解决这个问题,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我已经试过每一个代码只是崩溃或不会编译。 我无法find任何可行的。

好吧,让我们开始你应该检查什么。 在你的编译器中查找gl.h。 如果你没有找到它下载Windows SDK 。 如果你使用Visual Studio对你很好,如果不是只带OpenGL文件的话。 我建议你完整的SDK,因为我还没有找到gl.h单独,可能是因为每个人都有它..至于SDK,在Windows server 2003 R2平台SDK这些OpenGL文件是肯定的,但你应该先尝试Windows 7 / Vista SDK。

现在。 你提到了GLES。 我不知道GLES是如何工作的,因为我使用GLEW。 NeHe在很多方面写了很棒的教程,但他们已经过时了。 所以如果你喜欢继续我,使用GLEW 。 你将在开始时加入它,你将不得不提供图书馆。 喜欢这个

#include <GL/glew.h> #pragma comment(lib,"glew32.lib") 

你也将不得不复制glew32.dll到您的EXE文件夹。

现在你应该设置创建VBO。 我想你已经学会了如何创建空白窗口,如果不是这里的链接 。 如果你还没有下载GLUT(或者更好的freeglut),你将不得不下载它,但是它被广泛的使用,而且以后你将需要它。

我们会在代码中做一些补充。 在主函数中,像这样调用CreateWindow调用下的init()

 glutCreateWindow ("You're first OpenGL Window"); init(); 

并使函数init看起来像这样:

 void init(){ glewInit(); glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glShadeModel(GL_FLAT); glEnableClientState(GL_VERTEX_ARRAY); } 

也使reshape()func:

 void reshape(int w, int h){ glViewport(0,0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h); } 

并在glutDisplayFunc(display)下面加上这一行。

 glutReshapeFunc(reshape); 

现在我们已经为VBO做好了准备,实际上这只是一个小小的创造窗口,我们可以看到输出结果,但正如你所说的,有些问题我最好写下来,至于其他问题。

所以如何使用VBO如果你想看到结果现在这里的代码我会试着告诉你:make全局变量

 GLuint ID; 

之前的任何功能

在init()函数的底部添加这部分:

 float data[][2] = {{50,50},{100,50},{75,100}}; glGenBuffers(1,&ID); glBindBuffer(GL_ARRAY_BUFFER, ID); glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 

这部分变成这个时候空的显示功能:

 glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f,0.0f,0.0f); glBindBuffer(GL_ARRAY_BUFFER, ID); glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0); glDrawArrays(GL_POLYGON,0,3); glFlush(); 

你应该看到黑色的三角形。 所以到代码。 你做了某种数据。 然后你生成新的VBO ID,这个ID不被使用(在我们的例子中每次都是1)。 在Bind调用之后,你实际上创建了这个VBO,并用BufferData调用你的数据到VBO。 在显示中,你清除窗口使用,选择绘图颜色,现在绑定意味着激活这个缓冲区对象。 您可以在ARRAY_BUFFER中拥有多个VBO,但只有一个可以处于活动状态。 VertexPointer用于设置VBO的开始并在它的元素之间跨越。 正如你所看到的,我们使用X和Y坐标作为元素,所以步幅是2 * sizeof(float)。 这是因为步长是以字节为单位的。 Finnaly DrawArrays是渲染调用,你可以调用glBegin()和glEnd()。 你告诉画什么,在哪个范围内。 glFlush()只是用来显示渲染的东西。

如果你在代码的某个地方迷路了,它就在一个地方:

 #include <windows.h> #include <iostream> #include <GL/glew.h> #include <GL/freeglut.h> #pragma comment(lib,"glew32.lib") GLuint ID; void init(){ glewInit(); glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glShadeModel(GL_FLAT); glEnableClientState(GL_VERTEX_ARRAY); float data[][2] = {{50,50},{100,50},{75,100}}; glGenBuffers(1,&ID); glBindBuffer(GL_ARRAY_BUFFER, ID); glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); } void reshape(int w, int h){ glViewport(0,0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h); } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f,0.0f,0.0f); glBindBuffer(GL_ARRAY_BUFFER, ID); glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0); glDrawArrays(GL_TRIANGLES,0,3); glFlush(); } int main(int argc, char **argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(300,300); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } 

PS:我知道这是个月以前的问题,但我认为所有的问题都应该回答,以便找到相同问题的人不会到这里找不到;)

PSS:如果这个例子要求DLL在freeglut或者GLEW bin文件中;)

编辑1:我忘了那么所以不要犯同样的错误,你完成后,VBO销毁它,以防止内存泄漏。 由于VRAM不是那么大,这可能是严重的这里是如何做到这一点:

 glDeleteBuffers(1, &ID);