我尝试使用本教程 http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
我将它加载到我的visual studio 2008中,编译它,它说丢失的文件:“GLES / glplatform.h”所以我谷歌文件...然后它发出错误的文件:“KHR / khrplatform.h”,所以我也谷歌那个...然后它会扼杀一切可能,“GLDouble未声明的标识符”等等,即使该教程有#include应该有那些。
我不知道从哪里开始修复此问题,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我尝试过的每个代码只是崩溃或不会编译。我找不到有用的东西。
答案 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);