Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:16

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Aug 31, 2010 06:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Hi,

Wie der Titel schon sagt, habe ich ein Problem beim Zeichnen von einem VBO. Ich arbeite mit Delphi7 und rufe im OnCreate Ereignis meiner Form eine Methode auf, die das VBO nach der Initialisierung von OpenGl erstellt. Ziel ist es einen 2D-Einheitskreis in das VBO zu schreiben. Die Methode sieht wie folgt aus:

Code:
procedure GenerateCircle(AVertices:byte);
var pvec:pvec2;                                // Zeiger auf array[0..1] of single
    Radius,Alpha:single;
    i:Integer;
begin
  if (AVertices > 2)
  then begin
    glGenBuffers(1, @VBOCircle);                              // VBOCircle : gluint;
    glBindBufferARB(GL_ARRAY_BUFFER, VBOCircle);
    glEnableClientState(GL_VERTEX_ARRAY);

    glBufferDataARB(GL_ARRAY_BUFFER, AVertices*SizeOf(tvec2), nil, GL_STATIC_DRAW);
    pvec := glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

    Alpha := 2*pi/AVertices;
    Radius := 1/cos(pi/AVertices);

    for i:= 0 to AVertices-1 do
    begin
      pvec^[0] := Radius * cos(alpha * i);
      pvec^[1] := Radius * sin(alpha * i);

      inc(Integer(pvec),SizeOf(tvec2));
    end;
    glUnMapBuffer(GL_ARRAY_BUFFER);
  end;
end;


gezeichnet wird anschließend im OnIdle mit folgenden Aufrufen:

Code:
    glBindBufferARB(GL_ARRAY_BUFFER, VBOCircle);
    glInterleavedArrays(GL_V2F, SizeOf(tvec2), nil);
    glDrawArrays(GL_TRIANGLE_FAN, 0, CircleSides);


CircleSides ist die Variable in der die Anzahl der Vertices steht, die angibt, wie viele Seiten der Einheitskeis hat und wird auch an GenerateCircle() übergeben um das VBO zu erstellen.
Kann es sein, das meine Grafikkarte(NVidia Geforce 120 GT) keine VBOs unterstützt? Habe extra den aktuellen Treiber installiert (258.96_desktop_64bit), habe da aber das gleiche Problem. Das Betriebssystem ist Windows Vista 64bit. Es würde mich wundern, wenn die Karte VBOs nicht unterstütz, da FBOs und GLsl ohne Probleme laufen und diese ja erst später zum Standard wurden.
Alles was ich bekomme ist eine Access Violation in der nvogl32.dll mit folgender Meldung: "Zugriffsverletzung bei Adresse 69AA9410 in Modul 'nvogl32.dll'. Lesen von Adresse 00000000".
Der Rendercontext den ich erstelle ist kein 3.x oder 4.x Context sondern der Standard-Context, den man durch CreateRenderingContext() erhält. Merkwürdig ist auch, dass das Programm ohne Macken läuft, wenn ich nur den Aufruf von glDrawArrays() auskommentiere.

vielen Dank schonmal für Rettungsversuche,

sellmann.


Edit: Also das VBO hab ich nun zum Laufen bekommen, indem ich im OnIdle glDrawArrays() erst dann aufrufe, wenn die Methode GenerateCircle() True zurückgegeben hat (ich hab aus der procedure ne "function xy(z:t):boolean" gemacht). Allerdings ist die Anwendung jetzt verdammt lahm. Zumindest funktioniert der Mouselook nicht mehr so flüssig (und dabei hab ich mir soviel Mühe gegeben nen vernünftigen Mousebuffer zu implementieren, damit die Cam sich schön weich bewegt :( ). Dazu sei gesagt, dass ich den Mousbuffer im OnMouseMoveEvent bearbeite. Kann es daran liegen, oder ist meine Karte tatsächlich zu blöd mit VBOs umzugehen?

Edit2: Also laut Wikipedia soll die Nvidia Geforce 120 GT alles bis inklusive OpenGl3.3 unterstützen und VBOs sind ja seit 1.5 in den Kern mit eingebunden. Warum entsteht dann trotzdem dieser extreme Einbruch? Warum auch nur beim auslesen der Maus? Alle anderen Inputs (z.B. von der Tastatur) werden flüssig verarbeitet.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 31, 2010 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Keiner eine Idee, warum seit dem einbinden der VBOs mein Mouseevent so ruckelt? habs auch schon mit der Function GetCursorPos() versucht, aber da gibts kein besseres Ergebnis.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich glaube Du verdrehst da ein paar Dinge. Sieh mal hier: http://www.ozone3d.net/tutorials/opengl_vbo_p2.php, da ist genau beschrieben, wie das zu sein hat. Könnte was mit dem "glEnableClientState" zu tun haben, das vermutlich am völlig falschen Ort steht und ich seh auch gar kein zugehöriges "Disable". Aber ganz sicher weiß ich es natürlich auch nicht.

Ein kleiner Hinweis: Wenn Du umsteigen möchtest bringt es wirklich viel, *glInterleavedArrays* hinter sich zu lassen. Sieh mal hier: http://wiki.delphigl.com/index.php/VBO_ohne_glInterleavedArrays und es gibt auch noch eine modernere Variante hier: http://www.opengl.org/wiki/VBO_-_just_examples

*glInterleavedArrays* ist bloß ein Klotz am Bein.

Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Dann würde ich aber auch vorschlagen das Tutorial zum Thema VBO im Wiki anzupassen, denn da hab ich die verwendeten Funktionen her. Wäre ja blöd, wenn das nicht mehr der ordinäre Weg ist, den man gehen sollte mit VBOs, ihn aber dennoch weiter empfiehlt.

Die Links sind aufjedenfall sehr gut! Ich werde mir das ganze gleich mal zu Gemühte führen und heute Abend über mein Projekt ergießen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 10:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Falls Fehler in Tutorials gefunden werden, bitte diese genau eingrenzen und auch beschreiben was falsch ist und warum.
Wir beheben das dann bzw. wenn hier ein erfahrener Nutzer ist der das Verifizieren kann, dann kann der auch direkt die stellen am Tutorial korrigieren. Wir wollen mit den Tutorials einsteigern helfen, und keine Verwirrung stiften...;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Flash hat geschrieben:
Falls Fehler in Tutorials gefunden werden, bitte diese genau eingrenzen und auch beschreiben was falsch ist und warum
Nein, es ist nichts Falsches an dem Tutorial. Aber - es sind vermutlich schon mindestens 6 Jahre ins Land gezogen, seitdem es geschrieben wurde. Seither ist ziemlich viel passiert.

Dies ist ein Jahrzehnt gewesen, wo man sich in der Grafikprogrammierung nicht lang auf seinen Lobeeren ausruhen konnte :wink:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]