Einstieg in OpenGL, Anfängerprobleme



  • 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?



  • 2.1.8545 Release
    und
    1.5.6



  • *grübel* komm nicht drauf, worans liegen könne 🙂

    Hast du es schonmal mit

    glVertexPointerEXT(2,GL_INT,0,4,0);
    

    probiert?



  • Ich werd verrückt das klappt 😃
    Monate des Frustes endlich vorbei 🤡
    Danke dir 👍

    EDIT: NEIN
    Ich hab noch ein glVertexPointer von vorher übersehen, das direkt auf den Array gezeigt hat...



  • Wenn du Lust hast - pack mal alles zusammen in ein zip oder rar Archiv und schick mir das per Mail (also nicht nur Programmteile, sondern den kompletten code).

    Dann schau ich mir des mal genauer an - vlt find ich ja das Problem.



  • So hab das mal alles hochgeladen.
    Link
    Die Fehlermeldung die kommt ist diese hier:

    Eine Ausnahme (erste Chance) bei 0x6923c104 in OpenGL.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Unbehandelte Ausnahme bei 0x6923c104 in OpenGL.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    

    Wenn ich die Binary ganz normal starten will sagt Windows immer das hier:

    OpenGL.exe hat ein Problem festgestellt und muss beendet werden.
    


  • Tja - guter Rat ist teuer.
    Kann keinen Fehler finde.
    Programm läuft bei mir auch einwandfrei.
    😞



  • Ich werde demnächst mal einen anderen Compiler testen. Wenn es dann immernoch nicht klappt, liegt es wohl an der Hardware. Vielleicht wrde ich mir dann auch mal eine aktuellere GraKa besorgen.



  • Funktioniert das bei dir:
    vboTest



  • Ja tut es.
    Kann es sein, dass mein Compiler (MSVC 10.0) verbuggt ist? Und welchen anderen kann ich mir herunterladen, um es mal mit einem anderen zu probieren?

    EDIT:
    Mit sind gerade die Logfiles aufgefallen, und die sagen auch, dass alles OK ist.



  • Hm, nö, ich arbeite auch mit MSVS2010.
    Binde die libs zwar nicht über pragmas ein sondern geb sie bei den Projekteigenschaften unter Linker-Eingabe an, aber daran sollte es wohl nicht liegen denk ich.


Anmelden zum Antworten