好的,让我们从您应该检查的内容开始。在您的编译器中查找 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。如果不是here's link,我猜你已经学会了如何创建空白窗口。如果您尚未下载 GLUT(或更好的 freeglut),则必须下载它,但它已被广泛使用,无论如何您以后都将需要它。
我们将在该代码中添加一些内容。在 main func 中,像这样调用 CreateWindow 下的 init()
glutCreateWindow ("Your 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() 函数:
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,我会试着告诉你以下代码:
制作全局变量
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(在我们的示例中每次都是 1 :))。
在此之后使用 Bind 调用,您实际上创建了此 VBO,并使用 BufferData 调用您将数据分配给该 VBO。在显示中,您清除窗口以供使用,选择绘图颜色,现在 Bind 表示激活此缓冲区对象。您可以在 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 文件中;)
Edit1:我忘记了,所以不要犯同样的错误,在你完成 VBO 后销毁它以防止内存泄漏。由于 VRAM 不是那么大,这可能很严重,这是如何做到的:
glDeleteBuffers(1, &ID);