Einstieg in OpenGL, Anfängerprobleme
-
openglnoob schrieb:
Dann steht das hier in meiner Zeichenmethode:
[cpp]
glBindBuffer(GL_ARRAY_BUFFER, vboid);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_INT, 0, BUFFER_OFFSET(0));
glDrawArrays(GL_QUADS, 0, 8);
glDisableClientState(GL_VERTEX_ARRAY);
[/cpp]Du zeichnest aber nur 4 Vertices und nicht 8.
-
Hmm, da hab ich die Doku falsch verstanden, ohne VBO zeichnet der bei 4 auch noch alles. Allerdings hat das nichts gebracht. Ich hab meinen Code der Zeichenmethode noch ein bisschen aktualisiert:
glBindBuffer(GL_ARRAY_BUFFER, vboid); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, sizeof(vertices), BUFFER_OFFSET(0)); glDrawArrays(GL_QUADS, 0, 4); glDisableClientState(GL_VERTEX_ARRAY);
Aber irgendwas muss ich doch falsch machen, ansonsten würde es doch funktionieren
-
Ich hab jetzt mal bei einem Freund ausprobiert, der eine neuere GraKa hat, und bei ihm funktionierts. Aber wieso klappt es bei mir nicht, die glewinfo spuckt duch das hier aus:
glewinfo schrieb:
GL_VERSION_1_5: OK
---------------
glBeginQuery: OK
glBindBuffer: OK
glBufferData: OK
glBufferSubData: OK
glDeleteBuffers: OK
glDeleteQueries: OK
glEndQuery: OK
glGenBuffers: OK
glGenQueries: OK
glGetBufferParameteriv: OK
glGetBufferPointerv: OK
glGetBufferSubData: OK
glGetQueryObjectiv: OK
glGetQueryObjectuiv: OK
glGetQueryiv: OK
glIsBuffer: OK
glIsQuery: OK
glMapBuffer: OK
glUnmapBuffer: OKund meine GraKa müsste laut Herstellerinformationen mindestens OpenGL 2.0 unterstützen.
-
Glew hast du aber über glewInit(); initialisiert?
Dann solltest du den VertexPointer noch ändern, da du die Daten vom Pointer ja garnicht nutzen willst, sondern die des VBOs.
glVertexPointer(2, GL_INT,0,0);Vielleicht hilft das.
-
glewInit() ist drin, und BUFFER_OFFSET(i) ist so definiert:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
Steht so auf opengl.org
-
Mit deinem momentanen VertexPointer glVertexPointer(2, GL_INT, sizeof(vertices), BUFFER_OFFSET(0)) gibst du als stride aber den Wert 32 an. D.h. es wird angenommen, dass zwischen jedem Vertex 32byte liegen, die immer übersprungen werden. Da bei dir die Vertex-Daten aber direkt hintereinander stehen muss hier der Wert 0 angegeben werden.
Den Wert für stride wäre nicht 0, wenn du in deinem array auch noch Textur-Koordinaten und / oder Normalen-Koordinaten abgelegt hast. Dann müsstest du diese überspringen.
-
Noch nie hab ich mir mit der Doku so schwer getan wie hier. Jetzt versteh ich auch mal endlich was das heißt, denn es wird oft immer mit dem Zusammenhang von einem offset gebracht.
Aber wie schon ein paar Posts vorher geschrieben, habe ich da schon alle Werte ausprobiert, gerade auch mal wieder die Null, klappt aber alles nicht. Ich denkees liegt eher an der Hardware (?) nur habe ich keinen Plan was ich da machen soll.
-
Poste einfach mal deinen kompletten code, falls er nicht gerade zig-hunder Zeilen lang ist, wovon ich jetzt mal ausgehe wenn du nur ein kleines Quadrat zeichnest.
Als Anfänger gleich mit VBOs anzufangen ist allerdings auch nicht gerade vorteilhaft denke ich
Klar wird man komplexe Szenen nicht mit 1000000 mal glVertex3f(x,y,z) aufrufen - aber zum lernen der Grundlagen denke ich wäre das geeigneter.
So erkennt man später auch den Zusammenhang zwischen Texturkorrdinaten, Normalen und Vertexkorrdinaten besser.
-
Ja, würde ich auch gern sehen.
-
So hier ist der Quelltext:
// vbo.cpp #include "stdafx.h" GLint vertices[] = {0,0,50,0,50,50,0,50}; void VBO::init(void) { glGenBuffersARB(1, &vboid); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboid); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices), vertices, GL_STATIC_DRAW_ARB); }; void VBO::draw(void) { glBindBufferARB(GL_ARRAY_BUFFER, vboid); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, BUFFER_OFFSET(0)); glDrawArrays(GL_QUADS, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); }; // vbo.h class VBO { public: void init(void); void draw(void); private: GLuint vboid; }; // ganze OpenGL initialisierung bool OpenGL::init() { glewInit(); vbo.init(); glShadeModel(GL_SMOOTH); glClearColor(1.0, 1.0f, 1.0f, 1.0f); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); };
Das zeichnen wird dann eben in einer Endlosschleife gemacht.
Es ist auch egal, ob die ARB Versionen der Funktionen nehme oder nicht, kommt das selbe raus.
-
Hm - gesetzt der Fall, das das nur ein Auszug deines Programms bzw der Dateien ist / sind (was ich schwer hoffe :D) - kann ich keinen Fehler erkennen.
In der vbo.cpp wäre ein include des headers nicht verkehrt
*grübel*
Ich frag einfach mal ganz vorsichtig:
Das steht so nicht alles in einer Datei drin? Und ist auch nicht alles oder?
-
inter2k3 schrieb:
Hm - gesetzt der Fall, das das nur ein Auszug deines Programms bzw der Dateien ist / sind (was ich schwer hoffe :D) - kann ich keinen Fehler erkennen.
Der Rest ist ist einfach nur Standardcode, um ein Fenster zu erzeugen etc.
inter2k3 schrieb:
In der vbo.cpp wäre ein include des headers nicht verkehrt
In der stdafx.h ist alles drin.
inter2k3 schrieb:
Ich frag einfach mal ganz vorsichtig:
Das steht so nicht alles in einer Datei drin? Und ist auch nicht alles oder?Das steht so drin, ist aber nicht alles.
Ich hab jetzt mal versucht, die Funktionspointer zu bekommen und das sah dann so aus:
PFNGLGENBUFFERSARBPROC m_glGenBuffersARB; // VBO Name Generation Procedure PFNGLBINDBUFFERARBPROC m_glBindBufferARB; // VBO Bind Procedure PFNGLBUFFERDATAARBPROC m_glBufferDataARB; // VBO Data Loading Procedure m_glGenBuffersARB = reinterpret_cast<PFNGLGENBUFFERSARBPROC>(wglGetProcAddress("glGenBuffersARB")); m_glBindBufferARB = reinterpret_cast<PFNGLBINDBUFFERARBPROC>(wglGetProcAddress("glBindBufferARB")); m_glBufferDataARB = reinterpret_cast<PFNGLBUFFERDATAARBPROC>(wglGetProcAddress("glBufferDataARB"));
Und die haben auch alle einen Wert. Nur klappts immernoch nicht.
Aber bei der Binary von songho klappts auch mit VBO, und ich bin gerade dabei den Quellcode zu studieren.
-
Wenn Du GLew verwendest, brauchst Du die Dinger nicht selber mit glGetProcAdress laden^^.
Du musst das glewInit() nur einmal aufrufen, aber erst wenn der OpenGL-Context erzeugt wurd.
rya.
-
Hi, vielleicht hilft dir dieser Artikel weiter:
http://www.spieleprogrammierung.net/2010/07/opengl-vertexbuffer-und-indexbuffer.html
sowie dieses Tutorial:
http://www.spieleprogrammierung.net/2010/03/opengl-3-rendern-eines-texturierten_25.html
weitere Artikel und Tutorials zu OpenGL 3 und höher findest du hier:
http://www.spieleprogrammierung.net/
viel Spaß beim Lernen!
-
So hab jetzt endlich wieder Zeit, mich dem Problem zu widmen
Scorcher24 schrieb:
Wenn Du GLew verwendest, brauchst Du die Dinger nicht selber mit glGetProcAdress laden^^.
Du musst das glewInit() nur einmal aufrufen, aber erst wenn der OpenGL-Context erzeugt wurd.
rya.Wenn ich ein paar V-Sync Funktionen benutzen will, muss ich zu dem glewInit() zusätzlich die Funktionspointer laden, ansonsten klappts nicht. Die Funtkion rufe ich nach glewInit() auf, und RC wurde schon vor glewInit() erstellt.
AlexMaRu schrieb:
Hi, vielleicht hilft dir dieser Artikel weiter:
http://www.spieleprogrammierung.net/2010/07/opengl-vertexbuffer-und-indexbuffer.html
sowie dieses Tutorial:
http://www.spieleprogrammierung.net/2010/03/opengl-3-rendern-eines-texturierten_25.html
weitere Artikel und Tutorials zu OpenGL 3 und höher findest du hier:
http://www.spieleprogrammierung.net/
viel Spaß beim Lernen!
Danke, da werde ich mal rein schauen. Aber ich suche eher mehr was ab OpenGL 1.5 - 2.0, möchte auch ein bisschen abwärtskompatibel bleiben.
-
So ich hab jetzt mittels
glGetBufferParameterivARB(vboid, GL_BUFFER_SIZE_ARB, &bufferSize);
die Buffer-Größe ermittelt, und die ist null.
Also muss irgendwas an dieser Zeile falsch sein:glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboid); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices), vertices, GL_STATIC_DRAW_ARB);
vertices sieht so aus:
GLint vertices[] = {0,0,50,0,50,50,0,50};
Weiß da einer weiter, was man noch machen muss, damit die Daten auch in den Buffer geschrieben werden?
-
Ich habs jetzt geschafft, dass die VBOs gezeichnet werden und zwar so:
// initialisieren glGenBuffers(1, &vboid); glBindBuffer(GL_ARRAY_BUFFER, vboid); glBufferData(GL_ARRAY_BUFFER, 8*sizeof(GLint), vertices, GL_STATIC_DRAW); void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); glVertexPointer(2, GL_INT, 0, ptr); glUnmapBuffer(GL_ARRAY_BUFFER); // rendern glEnableClientState(GL_VERTEX_ARRAY); glDrawArrays(GL_QUADS, 0, 4); glDisableClientState(GL_VERTEX_ARRAY);
Allerdings widerspricht das allen Tutorials die ich gelesen habe. z. B. dem hier. Laut diesem Tutorial würde ich Punk 1.4 und 1.5 auf einmal benutzen.
Zudem steht bei jeder Beschreibung von glVertexPointer, dass der letzte Parameter das Offset ist
-
Hm, glVertexPointer sollte eigentlich nur 4 Paramter haben
Also bei mir funktioniert folgendes einwandfrei:
GLint vertices[] = {0,0,2,0,2,2,0,2}; glGenBuffers(1,&vboid); glBindBuffer(GL_ARRAY_BUFFER,vboid); glBufferData(GL_ARRAY_BUFFER,8*sizeof(GLint),vertices,GL_STATIC_DRAW); glVertexPointer(2,GL_INT,0,0); glEnableClientState(GL_VERTEX_ARRAY); glDrawArrays(GL_QUADS,0,4); glDisableClientState(GL_VERTEX_ARRAY);
-
Hmm bei mir kommt wieder die Zugriffsverletzung an Position 0.
Irgendwie scheint dem glVertexPointer nicht ganz klar zu sein, dass ich ein VBO hab.
Und VBOs werden von meiner GraKa ganz sicher unterstützt. Ich hab schon alle möglichen Funktionen und externen Tests probiert, und alle sagen, dass meine GraKa VBOs kann. Die Beispiele aus dem Inet laufen ja auch alle auf meinem PC.
-
Hmpf - eigenartig.
Was gibt denn glGetString(GL_VERSION) und glewGetString(GLEW_VERSION) aus?