【问题标题】:How to get VBO working如何让 VBO 工作
【发布时间】:2011-03-08 11:31:55
【问题描述】:

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

我将它加载到我的 Visual Studio 2008 中,编译它,它说缺少文件:“GLES/glplatform.h”所以我用谷歌搜索该文件...然后它抱怨缺少文件:“KHR/khrplatform.h”,所以我也用谷歌搜索...然后它抱怨一切可能,“GLDouble undeclared identifier”等,即使该教程有#include应该有这些。

我不知道从哪里开始解决这个问题,谁能给我如何正确使用 VBO 的代码(画一个立方体等),我尝试的每个代码都只是崩溃或无法编译。我找不到任何有用的东西。

【问题讨论】:

  • glplatform.h #included 在this archive 的什么位置?如果有的话,它应该抱怨缺少 glaux.h,这是非常,非常弃用的。
  • 是的,你能给我举个例子吗?我能找到的只是老废话......

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


【解决方案1】:

好的,让我们从您应该检查的内容开始。在您的编译器中查找 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);

【讨论】:

  • 太棒了,终于有了一些进展!似乎崩溃是由于未调用 glewInit() 引起的。天哪,我搞定了,这真的是 VBO 吗?我开始怀疑它,因为它有效! :D 谢谢!
  • 很高兴它可以工作我也很难用 VBO :D 如果你正在学习 openGL,也许更好的解决方案是 RedBook 然后 NeHe,因为它更新非常频繁。那本书唯一不好的地方是,我认为示例比应有的复杂得多,但是您做到了一切……真的;)
  • 你想帮助我让颜色数组工作吗?如果你愿意,我可以开始新问题。
  • 我看过网上的例子,但这是第一个只有基本的例子。让 VBO 工作并学习它真的很好。
  • @Raven,应该在哪里调用 glDeleteBuffers(1, &amp;ID);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-04-07
  • 2011-07-27
  • 2023-03-22
相关资源
最近更新 更多