2010-06-25 8 views
7

Ich habe versucht, dieses Tutorial bekommen http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45Wie VBO Arbeits

ich es in meinem Visual Studio 2008 kompilieren laden zu verwenden, und es sagt Datei fehlt: „GLES/glplatform.h“ ich die Datei so google ... dann wimmert es fehlende Datei: "KHR/hrplatform.h", also google ich das auch ... dann wimmert es alles Mögliche, "GLDouble undeclared identifier" etc etc, obwohl dieses Tutorial #include hat, welches diese haben soll .

Ich weiß nicht, wo ich anfangen soll, dies zu reparieren, könnte jemand mir Code geben, wie VBO richtig zu verwenden (zeichnen Sie einen Würfel usw.), jeder Code, den ich versucht habe, stürzt einfach ab oder wird nicht kompilieren. Ich kann nichts finden, was funktioniert.

+0

Wo in [dieses Archiv] (http://nehe.gamedev.net/data/lessons/vc/lesson45.zip) ist glplatform.h # enthalten? Wenn überhaupt, sollte es sich über ein fehlendes glaux.h beschweren, was sehr, sehr veraltet ist. – genpfault

+0

YEah, könnten Sie mir ein Beispiel geben, das funktioniert und nicht veraltet ist? alles, was ich finden kann, ist alter Mist ... – Newbie

Antwort

13

ok, also fangen wir mit dem an, wonach Sie suchen sollten. Suchen Sie in Ihrem Compiler nach gl.h. Wenn Sie es nicht finden, laden Sie Windows SDK herunter. Wenn Sie Visual Studio gut für Sie verwenden, nehmen Sie nicht nur die OpenGL-Dateien. Ich schlage Ihnen volle SDK vor, weil ich gl.h separally nicht gefunden habe, wahrscheinlich, weil jeder es hat .. Wie für das SDK, in Windows Server 2003 R2 Plattform SDK diese OpenGL-Dateien sind sicher, aber Sie sollten zuerst Windows 7 versuchen/Vista SDK.

Jetzt. Du hast GLES erwähnt. Ich weiß nicht, wie GLES funktioniert, weil ich GLEW benutze. In vielerlei Hinsicht hat NeHe großartige Tutorials geschrieben, die aber veraltet sind. Wenn Sie also mit mir weitermachen möchten, verwenden Sie GLEW. Sie werden es bei Start einfügen + Sie müssen eine Bibliothek bereitstellen. So müssen

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

Auch müssen Sie glew32.dll in den Ordner kopieren, wo Ihre EXE ist.

Jetzt sollten Sie zum Erstellen von VBO eingerichtet werden. Ich nehme an, dass Sie bereits gelernt haben, wie man ein leeres Fenster erstellt, wenn nicht here's link. Sie müssen GLUT (oder besser Freeglut) herunterladen, wenn Sie es nicht schon getan haben, aber es ist weit verbreitet und Sie werden es später sowieso brauchen.

Wir werden einige Ergänzungen in diesem Code vornehmen. In Haupt func, rufen init() unter Create wie nennen dieses

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

und Funktion aussehen init wie folgt aus:

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

auch reshape() Func machen:

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

und füge diese Zeile unter glutDisplayFunc (display) hinzu;

glutReshapeFunc(reshape); 

Jetzt sind wir bereit für VBO eigentlich diese nur trivial Erstellen von Fenster war, wo wir Ausgabe sehen können, aber wie Sie gesagt hatte einige Probleme, die ich es besser aufschrieb, wie für andere.

So wie VBO verwenden, wenn Sie Ergebnis wollen jetzt hier den Code sehen Ich werde versuchen, Sie davon zu erzählen: globale Variable machen

GLuint ID; 

, bevor irgendwelche Funktionen

hinzufügen, um dieses Teil auf der Unterseite der init() Funktion:

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

und diesen Teil in Anzeigefunktion, die in diesem Moment leer ist:

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

Sie sollten schwarzes Dreieck sehen. Also zum Code. Du machst irgendeine Art von Daten. Dann generieren Sie eine neue VBO ID, die nicht verwendet wird (wird in unserem Beispiel immer 1 sein :)). Danach mit Bind Anruf erstellen Sie tatsächlich diese VBO und mit BufferData Call Sie Ihre Daten zu diesem VBO zuweisen. In der Anzeige löschen Sie das Fenster zur Verwendung, wählen die Zeichnungsfarbe und jetzt bedeutet das Binden ACTIVATE dieses Pufferobjekt. Sie können die Anzahl der VBO in ARRAY_BUFFER haben, aber nur eine kann aktiv sein. VertexPointer wird verwendet, um den Anfang von VBO festzulegen und zwischen den Elementen zu wechseln. Wie Sie sehen können, haben wir X- und Y-Koordinaten als Elemente verwendet, so dass Schritt 2 * sizeof (float) ist. Das ist, weil Schritt in Bytes ist. Finnaly DrawArrays ist ein Render-Aufruf, etwas, was man glBegin() und glEnd() nennen würde. Sie sagen, was und in welchem ​​Bereich zu zeichnen ist. glFlush() wird nur zum Anzeigen gerenderter Objekte verwendet.

Wenn Sie hier irgendwo verloren gegangen in Code ist es an einem Ort:

#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: Ich weiß, dass in diesem Monat alte Frage, aber ich denke, dass alle Fragen beantwortet werden sollen, so dass jeder für gleiches Problem suchen gewonnen‘ t bekommen hier und finden nichts;)

PSS: Wenn dieses Beispiel für DLL fragt man sie in freeglut oder GLEW bin Dateien haben;)

Edit1: ich für das vergessen haben, also nicht denselben Fehler machen, nach Sie sind fertig mit VBO zerstören Sie es, um Speicherleck zu verhindern. Wie VRAM nicht so groß ist, kann dies hier ist ernst sein, wie es geht:

glDeleteBuffers(1, &ID); 
+0

GREAT, endlich etwas Fortschritt! Scheint so, als ob der Absturz verursacht wurde, indem glewInit() nicht aufgerufen wurde. OMG ich habe es funktioniert, ist das wirklich VBO? Ich fange an zu zweifeln, da es funktioniert! : D dankts! – Newbie

+0

glücklich für dich, dass es funktioniert habe ich auch mit VBO harte Zeit: D wenn Sie OpenGL lernen, vielleicht bessere Lösung wäre RedBook dann NeHe, weil es sehr häufig aktualisiert wird. Nur schlechte Sache in diesem Buch, ich denke, Beispiele sind komplexer als sie sollten, aber du hast dort alles .. wirklich;) – Raven

+0

willst du mir helfen, Farben Array arbeiten zu bekommen? Ich kann neue Frage beginnen, wenn Sie mögen. – Newbie