如何让VBO工作

时间:2010-06-25 21:09:18

标签: c++ windows visual-studio-2008 opengl

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

我将它加载到我的visual studio 2008中,编译它,它说丢失的文件:“GLES / glplatform.h”所以我谷歌文件...然后它发出错误的文件:“KHR / khrplatform.h”,所以我也谷歌那个...然后它会扼杀一切可能,“GLDouble未声明的标识符”等等,即使该教程有#include应该有那些。

我不知道从哪里开始修复此问题,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我尝试过的每个代码只是崩溃或不会编译。我找不到有用的东西。

1 个答案:

答案 0 :(得分:13)

好的,让我们从您应该检查的内容开始。在编译器中查找gl.h。如果您找不到它,请下载Windows SDK。如果您正在使用适合您的Visual Studio,那么如果不使用OpenGL文件。我建议你使用完整的SDK,因为我还没有找到gl.h,可能是因为每个人都有它。至于SDK,在Windows Server 2003 R2 Platform 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 ("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()函数:

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。在显示中,您清除使用窗口,选择绘图颜色,现在绑定意味着激活此缓冲对象。您可以在ARRAY_BUFFER中拥有多个VBO,但只有一个可以处于活动状态。 VertexPointer用于设置VBO的开始并在它的元素之间进行跨越。如您所见,我们使用X和Y坐标作为元素,因此stride是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);