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

Aktuelle Zeit: Di Apr 16, 2024 21:44

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: So Dez 21, 2014 08:03 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Was ich herausgefunden habe:
Die Heightmap wird von (-255,0,-255) gezeichnet, geht dann die erste Reihe zu (256,0,-255)
und macht dann mit Reihe (-255,0,-254) bis (256,0,-254) weiter.
Die letzte gezeichnete Reihe wäre (256,0,-255) bis (256,0,256). (Die Heightmap(TGA) hatte Auflösung von 512x512, aus der nur Rot ausgelesen wird).
Die Displayliste wird vor dem Aufruf nicht translatet, also direkt im Ursprung gezeichnet.

Drehe ich die z-Koordinaten um, so ist die Blickrichtung bei der alles verschwindet die -z Richtung statt der z Richtung.
Verschiebe ich die ganze Heightmap um 255 Richtung z, so wird bei jedem Winkel alles angezeigt(egal ob via translate oder dem versetzen der Koordinatenvektoren).

Meine Mutmaßung ist, dass der "Ankerpunkt" bzw Koordinatenursprung des Heightmap-drawElements-Konstruktes irgendwie nach 0,0,-255 geraten ist oder so behandelt wird. Gerät dieser Punkt zu weit aus dem aktuellen Bild(ca 80° von der aktuellen Blickrichtung), so wird das ganze Konstrukt komplett als "nicht sichtbar" behandelt.

Eine andere Mutmaßung war, daß es vielleicht etwas mit Overdraw zu tun hat, was ich allerdings als sehr unwahrscheinlich erachte. Die Menge der gezeichneten Vertexe scheint keine Rolle zu spielen, da das ganze auch verschwindet, wenn ich nur 1/6 der Triangles zeichne.

Der einzige Workaraound wäre, jedes Dreieck mittels immediate Mode zu zeichnen statt mit drawElements, aber da bricht meine framerate auf unter 50 fps zusammen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 21, 2014 08:24 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
dj3hut1 hat geschrieben:
Hallo,

könnte sein, dass bei deinem Grafiktreiber irgend eine Form von Culling-Optimierung eingestellt ist.

Viele Grüße
dj3hut1

Wie kann man sowas überprüfen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 21, 2014 13:01 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Mittels glIsEnabled(GL_CULL_FACE) geht das.

Du kannst natürlich auch einfach einmal testweise glDisable(GL_CULL_FACE) machen ;)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 21, 2014 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
@Skeltek ich weiß nicht wie es bei ATI ist, aber bei Nvidia gibt es auf dem Desktop eine "NVIDIA Systemsteuerung", mit der man die 3D-Einstellungen verwalten kann. Dort kann man so Sachen wie Antialiasing, Texturfilterung oder vSync einstellen.

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 21, 2014 14:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Vielleicht lohnt sich auch das Lesen von dieser Seite. :mrgreen:

glEnableClientState() und glVertexPointer() machen in der Display-Liste keinen Sinn, da damit client und nicht server states verändert werden. Du müsstest diese Funktionen also nochmal extra vor glCallList aufrufen. glDisable(GL_LIGHTING) und glDisable(GL_CULL_FACE) dagegen würde ich sicherheitshalber lieber mit in die Display-Liste reinnehmen.

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 22, 2014 21:39 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
end hat geschrieben:
Mittels glIsEnabled(GL_CULL_FACE) geht das.

Du kannst natürlich auch einfach einmal testweise glDisable(GL_CULL_FACE) machen ;)

Hatte ursprünglich nicht herausgelesen, daß du cullface meinst.
Mit der Orientierung der Polygonzüge hat das ganze leider nichts zu tun.
Und ja, Cullface hatte ich auch bereits disabled zur Sicherheit.

Das wäre der Code für die Liste:
Code:
  1.  
  2.     heightMapDisplayListNumber=glGenLists(1);
  3.         glEnableClientState(GL_VERTEX_ARRAY);
  4.         glEnableClientState(GL_NORMAL_ARRAY);
  5.  
  6.         glVertexPointer(3,GL_FLOAT,0,hmVertexBuffer);
  7.         glNormalPointer(GL_FLOAT,0,hmNormalBuffer);
  8.             glNewList(heightMapDisplayListNumber,GL_COMPILE);
  9.                 glDrawElements(GL_TRIANGLES,(mapWidth-1)*(mapHeight-1)*6,GL_UNSIGNED_INT,hmIndices);
  10.             glEndList();
  11.  
  12.         glDisableClientState(GL_NORMAL_ARRAY);
  13.         glDisableClientState(GL_VERTEX_ARRAY);
  14.     DisplayManager::displayListenAnzahl++;
  15.  

Ich glaube kaum, dass man da so viel falsch machen kann.
Es scheint mir wirklich mit dem nördlichsten mittleren Punkt der Karte zusammenzuhängen...
Wie ich sagte, auf den anderen Rechnern geht es. Leider habe ich keinen zweiten Rechner mit Radeon Karte zum testen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 23, 2014 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Rufst du auch glEnableClientState und glVertexPointer/glNormalPointer vor glCallLists auf?

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 25, 2014 23:47 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Wozu das denn? Die Vektoren sind doch bereits erstellt?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 26, 2014 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Ok, du hast recht, die Doku sagt: ...Because the array pointers and enables are client-side state, their values affect display lists when the lists are created, not when the lists are executed.

Von Vertex-Arrays in Displaylisten wird allerdings eher abgeraten (16.100). Durch den zusätzlichen Speicherverbrauch kann deine Anwendung sogar deutlich langsamer werden, kommt aber auf die Implementierung an.

Wieso nutzt du eigentlich keine VBOs?

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 27, 2014 02:46 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
VBOs nicht, weil uns das Verwenden externer Bibliotheken untersagt wurde. Und VBOs ohne Bibs einzusetzen wäre laut vielen Leuten eine Unzumutbarkeit gewesen.

Interessanter Link den du angibst. Allerdings wird dort gesagt, daß Vertex Arrays mehr Speicherplatz verwenden wenn man pro Vertex Polygon-abhängig mehrere Normalenvektoren benötigt.
Allerdings ist das ja bei Smooth-Shading nicht der Fall.
Ich benutze pro Vertex den gewichteten Mittelwert den angrenzenden Flächennormalen, also ist es im Fall der Heightmap keine Vervielfachung(Versechsfachung) der zu speichernden Vektoren.

Im Übrigen habe ich vermutlich ohnehin den GPU-Speicher nicht annähernd ausgereizt. Es war ja nur ein Hochschulprojekt und keine professionelle Anwendung.
Ich habe nur gemerkt, dass die Anwendung eine deutlich langsamere Framerate aufweist, wenn ich statt dem Vertexarray die Triangles im Immediate Mode abspeichere...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 27, 2014 14:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Zumindest sollte man nicht VBOs und Displaylisten gleichzeitig verwenden, da dann der gesamte Speicherbereich kopiert wird (siehe diesen Forumsbeitrag).

Für Vertex Arrays machen VBOs sehr viel Sinn, das Zeichnen im Immediate Mode ist natürlich noch viel weniger zu empfehlen. Überzeugt euren Professor doch, dass ihr modernes OpenGL lernen wollt (wobei VBOs auch schon über 10 Jahre auf dem Buckel haben). VBOs gehören heute längst zum Standard und sollten problemlos auch in Hochschulprojekten benutzt werden dürfen. :roll:

Wenn ihr keine externen Bibliotheken benutzen sollt, dürftet ihr eigentlich auch kein freeglut verwenden. glew und freeglut oder openglut gehören aber nunmal zu den absoluten Basisbibliotheken, um mit OpenGL anständig zu programmieren.

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 27, 2014 19:48 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Ja, wie gesagt. Projekt ist gelaufen, Ziel war es eher sich mit der zugrundliegenden Mechanik auseinander zu setzen.

Was ich allerdings nun Zeit gehabt habe zum testen:
Wenn ich das exakt selbe drawElements in meiner drawFunction aufrufe, tritt der Fehler nicht auf.
Hier der Code:
Code:
  1.  
  2. void Objektdatenbank::zeichneDisplayListen()
  3. {
  4.     for (int i=257; i<=DisplayManager::displayListenAnzahl;i++)
  5.     {
  6.         glCallList(i);
  7.     }
  8.  
  9.     glColor4f(1,1,1,1);
  10.     glEnableClientState(GL_VERTEX_ARRAY);
  11.     glEnableClientState(GL_NORMAL_ARRAY);
  12.         glVertexPointer(3,GL_FLOAT,0,HeightMap::hmVertexBuffer);
  13.         glNormalPointer(GL_FLOAT,0,HeightMap::hmNormalBuffer);
  14.         glDrawElements(GL_TRIANGLES,(HeightMap::mapWidth-1)*(HeightMap::mapHeight-1)*6,GL_UNSIGNED_INT,HeightMap::hmIndices);
  15.     glDisableClientState(GL_NORMAL_ARRAY);
  16.     glDisableClientState(GL_VERTEX_ARRAY);
  17. }
  18.  

funktioniert

Dagegen:
Code:
  1.  
  2. void InitializationRoutines::init(void)
  3. {
  4. ...
  5.     heightMapDisplayListNumber=glGenLists(1);
  6.         glEnableClientState(GL_VERTEX_ARRAY);
  7.         glEnableClientState(GL_NORMAL_ARRAY);
  8.         glVertexPointer(3,GL_FLOAT,0,HeightMap::hmVertexBuffer);
  9.         glNormalPointer(GL_FLOAT,0,HeightMap::hmNormalBuffer);
  10.     glNewList(HeightMap::heightMapDisplayListNumber,GL_COMPILE);
  11.         glDrawElements(GL_TRIANGLES,(HeightMap::mapWidth-1)*(HeightMap::mapHeight-1)*6,GL_UNSIGNED_INT,HeightMap::hmIndices);
  12.     glEndList();
  13.     DisplayManager::displayListenAnzahl++;
  14.         glDisableClientState(GL_NORMAL_ARRAY);
  15.         glDisableClientState(GL_VERTEX_ARRAY);
  16. ...
  17. }
  18. mit
  19. void Objektdatenbank::zeichneDisplayListen()
  20. {
  21.     for (int i=257; i<=DisplayManager::displayListenAnzahl;i++)
  22.     {
  23.         glCallList(i);
  24.     }
  25. }
  26.  
  27.  

funktioniert nur fehlerhaft, sodass die Heightmap gar nicht erst gerendert wird sobald man in diversen Winkeln Richtung -z schaut.

Verstehe es halt nicht... es ist exakt dieselbe Zeichenanweisung, nur dass sie einmal direkt ausgeführt und das andere mal gespeichert und dann ausgeführt.

ps:
DisplayList mit VertexArray(Triangles): 38 Frames/s (Heightmap wird bei Blickrichtung nach Süden nicht angezeigt, die Frame/s werden aber nicht erhöht; fraglich ob sie "unsichtbar" gerendert wird)
DisplayList mit ImmediateMode(Triangles): 26-28 Frames/s
DirectDraw mit VertexArray(Triangles): 18-19 Frames/s


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 28, 2014 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Was ich noch sehe ist, dass du beim DirectDraw explizit Werte für glColor übergibst. Kann es sein, dass eines deiner anderen Display-Objekte beim Erstellen den Wert für glColor verändert? glColor4f sollte auf jeden Fall mit in die Display-Liste gespeichert werden, ansonsten wird beim Aufruf von glDrawElements ein zufälliger aktueller Farbwert gesetzt. Vor glCallList hätte glColor dann sowieso keine Wirkung.

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 28, 2014 20:56 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
dj3hut1 hat geschrieben:
Was ich noch sehe ist, dass du beim DirectDraw explizit Werte für glColor übergibst.

Ja, das ist mir auch schon aufgefallen :-D
Das ist nur "fail-safe". Ich rufe glColor4f grundsätzlich sowohl in der Zeichenmethode als auch in der aufrufenden Funktion auf, um nach jedem Codeschnipsel den Standard wieder herzustellen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 21 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.608s | 18 Queries | GZIP : On ]