New*_*bie 7 c++ windows opengl visual-studio-2008
我尝试使用本教程 http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
我在我的visual studio 2008加载它,编译它,它说丢失的文件:"GLES/glplatform.h"所以我谷歌文件...然后它发出遗漏的文件:"KHR/khrplatform.h",所以我谷歌那也是......然后它会扼杀所有可能的,"GLDouble未声明的标识符"等等,即使该教程有#include应该有那些.
我不知道从哪里开始修复这个,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我尝试过的每个代码只是崩溃或不会编译.我找不到有用的东西.
Rav*_*ven 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.我猜你已经学会了如何创建空白窗口,如果不是这里的链接.如果你还没有下载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(显示)下添加此行;
glutReshapeFunc(reshape);
现在我们已经为VBO做好了准备,实际上这只是简单的创建窗口,我们可以看到输出,但正如你所说,你有一些问题,我最好把它写下来,就像其他人一样.
那么如果你想看到结果现在如何使用VBO这里的代码我会试着告诉你它:make global variable
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文件;)
编辑1:我忘记了这一点,所以不要犯同样的错误,在你完成VBO之后销毁它以防止内存泄漏.由于VRAM不是很大,所以这里可以认真对待如何:
glDeleteBuffers(1, &ID);