views:

110

answers:

3

I tried to use this tutorial http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45

I load it in my visual studio 2008, compile it, and it says missing file: "GLES/glplatform.h" so i google the file... then it whines missing file: "KHR/khrplatform.h", so i google that too... then it whines everything possible, "GLDouble undeclared identifier" etc etc, even though that tutorial has #include which should have those.

I dont know where to start fixing this, could someone just give me code how to use VBO properly (draw a cube etc), every code i have tried just crashes or wont compile. i cant find anything that works.

A: 

You might try this VBO tutorial.

genpfault
argfh... thats what ive already tried... it just crashes
Newbie
@Newbie: The binary works fine on my XP box using a Radeon 4870. Are you sure your OpenGL implementation [supports GL_ARB_vertex_buffer_object](http://www.realtech-vr.com/glview/)?
genpfault
yes, all those binaries works on my machine too, but when i try to compile those myself, it crashes on the first VBO function call, or whines a lot about stuff i dont have when i try to compile etc
Newbie
A: 

http://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-1---tutorial-01 Check this out

http://www.ozone3d.net/tutorials/opengl_vbo_p3.php#downloads also an example

hkon
tried to download it, says corrupt archive, tried to look older versions, says page not found. this is what i get from every page that is talking abuot VBO, i am cursed. i say.
Newbie
this works like a charm: http://www.ozone3d.net/tutorials/opengl_vbo_p3.php#downloads
hkon
i get million errors from compiling that... first error is "error C2065: 'GLdouble' : undeclared identifier" any idea whats wrong? could someone give all the libraries needed, i think i may have some incompatible libraries or something.
Newbie
Looks like you don't have OpenGL installed
hkon
trust me, i have... i made 3d application already, and ive tested other VBO codes in that application, but i get those same errors >_>
Newbie
A: 

ok so let's start with what you should check for. In your compiler look for gl.h . If you won't find it download Windows SDK. If you are using Visual Studio good for you, if not take just the OpenGL files. I suggest you full SDK because I haven't yet found gl.h separatelly, probably because everybody has it.. As for the SDK, in Windows Server 2003 R2 Platform SDK these openGL files are for sure, but you should try first Windows 7/Vista SDK.

Now. You mentioned GLES. I don't know how GLES work because I use GLEW. In many ways NeHe wrote great tutorials but they're getting outdated. So if you like to continue with me, use GLEW. You will include it on start + you will have to provide library. Like this

#include <GL/glew.h>
#pragma comment(lib,"glew32.lib")

Also you will have to copy glew32.dll to folder where your EXE is.

Now you should be set up for creating VBO. I guess that you already learned how to create blank window if not here's link. You will have to download GLUT(or better freeglut) if you didn't already, but it is widely used and you will need it later on anyway.

We'll do some additions in that code. In main func, call init() under CreateWindow call like this

glutCreateWindow ("You’re first OpenGL Window");
init();

and make function init look like this:

void init(){
    glewInit();
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glShadeModel(GL_FLAT);
    glEnableClientState(GL_VERTEX_ARRAY);
}

also make reshape() func:

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);
}

and add this line under glutDisplayFunc(display);

glutReshapeFunc(reshape);

Now we are ready for VBO actually this was just trivial creating of window where we can see output but as you said you had some problems I better wrote it down, as for others.

So how to use VBO if you want to see result now here's code I'll try to tell you about it: make global variable

GLuint ID;

before any of functions

add this part on bottom of init() function:

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);

and this part into display function which is empty in this moment:

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();

You should see black triangle. So to the code. You make some sort of data. Then you generate new VBO ID which is not in use(will be 1 in our example everytime :) ). After this with Bind call you actually create this VBO and with BufferData call you asign your data to that VBO. In display, you clear window for use, select drawing color and now the Bind means ACTIVATE this buffer object. You can have number of VBO in ARRAY_BUFFER but only one can be active. VertexPointer is use to set begining of VBO and strides between it's elements. As you can see we used X and Y coordinates as elements so stride is 2*sizeof(float). That's because stride is in bytes. Finnaly DrawArrays is render call, something as you would call glBegin() and glEnd(). You tell what to draw, and in which range. glFlush() is just used for showing rendered stuff.

If you got lost somewhere in code here it is on one place:

#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: I know this is month old question but I think all questions should be answered so anyone looking for same problem won't get here and find nothing ;)

PSS: If this example asks for DLL you have them in freeglut or GLEW bin files ;)

Edit1: I forgot for that so don't make same mistake, after you are finished with VBO destroy it to prevent memory leak. As VRAM isn't so big this can be serious here's how to do it:

glDeleteBuffers(1, &ID);
Raven
GREAT, finally some progress! Seems like the crash was caused by not calling glewInit(). OMG i got it working, is this really VBO? i start to doubt it since it works! :D thanksss!
Newbie
happy for you that it works I had also hard time with VBO :D if you are learning openGL maybe better solution would be RedBook then NeHe, because it's updated very frequently. Only bad thing on that book I think examples are more complex then they should be but you got there everything.. really ;)
Raven
do you want to help me to get colors array working? i can start new question if you like.
Newbie
Nevermind, i think i got it working now.
Newbie