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

Aktuelle Zeit: Mo Jul 07, 2025 05:59

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Feb 20, 2006 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Hallo,

ich würde gerne eine Stadtlandschaft darstellen, die aus geometrischen Gebäuden besteht und einfarbig ist. In der Anwendung soll's dann nur darum gehen, sich zwischen den Gebäuden durch zu navigieren, Texturen brauche ich dazu keine. Ich möchte, dass die Flächen der Objekte undurchsichtig sind, beispielsweise weiss, aber dass die sichtbaren Kanten der Gebäude mit Linien nachgezogen werden.
Bis jetzt hab' ich das zum Ausprobieren mit Quadern geschafft, indem ich zuerst die Flächen gezeichnet habe und dann die Kanten nachgezeichnet habe, wobei ich auf die Koordinaten der Vertices etwas draufaddiert habe, damit die Linien nicht in der Fläche verschwinden. Das wird wesentlich komplizierter, wenn man nicht nur Quader darstellen will ... Aber da gibt's doch bestimmt einen Befehl dafür, dass mir OpenGL die sichtbaren Kanten von selbst nachfährt und dabei trotzdem die sichtbaren Flächen abgedeckt werden, oder ??

... Vielen Dank schon mal für Eure Antworten ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 20, 2006 19:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Du kannst einfach deine Flächen alle normal zeichnen. Anschließend deaktivierst du den Schreibschutz des Tiefenpuffers (glDepthMask) und renderst alle deine Linien. Stelle noch sicher, dass die Funktion des Tiefentests (glDepthTest) auch wirklich GL_LEQUAL ist.
Nicht vergessen nach dem Zeichnen deiner Linien den Schreibschutz wieder zu deaktivieren. Dann sollte alles so aussehen, wie du es dir vorstellst. Zumindest wenn ich dich richtig verstanden habe...

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 20, 2006 21:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Super, das hat funktioniert, dankeschön ...
glDepthFunc(GL_LEQUAL);
glDepthMask(true);

glDepthMask(false);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 21, 2006 13:22 
Offline
DGL Member
Benutzeravatar

Registriert: So Feb 06, 2005 17:29
Beiträge: 187
Programmiersprache: C, C++
Schau dir auch mal glPolygonMode an ..

_________________
Flummi: Projektseite und Projektthread


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 22, 2006 16:19 
Offline
DGL Member

Registriert: Mo Feb 06, 2006 14:55
Beiträge: 6
Wohnort: Essen
Du kannst auch erst die front faces - glCullFace(GL_BACK) - mit glPolygonMode(GL_FRONT,GL_FILL) zeichnen, dann die Linienbreite - z.B. glLineWidth(5.0f) - erhöhen und die back faces - glCullFace(GL_FRONT) - mit glPolygonMode(GL_BACK,GL_LINE) in z.B. schwarz zeichnen. Das hat den (vermutlich) gewünschten Effekt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 22, 2006 16:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Linienbreite zur erhöhen kann bei großen Szenen aber Performance kosten (glaub ich umindest).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 03:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
Hallo allerseits

An diesem Problem stehe ich auch gerade.
Ich habe eine Wireframe Fläche und möchte gerne die logisch unischtberan Konturen nicht sehen.

Zitat:
Du kannst einfach deine Flächen alle normal zeichnen. Anschließend deaktivierst du den Schreibschutz des Tiefenpuffers (glDepthMask) und renderst alle deine Linien.


anscheinend hat das für den ölgötz schon gereicht :roll:

bin halt eben doch noch ein noob :P

könnte mir das jemand etwas "lansamer" erklähren?


genauer:
meine geometrie schreibe ich in eine Liste: glNewList(objects, GL_COMPILE);, welche ich in der paint routine nur noch mit glCallList(objects); auslese/darstelle.
muss ich nun zwei listen machen und zuerst die eine auslesen - tiefenpuffer aktivieren (keine ahnung wie das geht) - zweite liste auslesen - tiefenpuffer dektievieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 07:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kommt ganz drauf an. Wenn du die Punkte in der ersten Liste so übergeben hast, dass du sie genau so auch an GL_LINE_STRIP übergeben kannst, dann kannst du die Liste einfach nochmal aufrufen. Ansonsten (was wahrscheinlich ist) wirst du eine zweite Liste machen müssen.

Tiefentest kannst du deaktivien mit glDisable(GL_DEPTH_TEST). Siehe auch unser Wikieintrag zu Tiefentest.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 08:05 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Ich hatte mal genau so ein Problem, das habe ich dann mit glPolygonOffsetgelöst. Zuerst mit eingeschaltetem Backfaceculling die Flächen, dann den Offset verändert und danach alle Linien. (in dem Fall konnte man auch in die Quader reinschauen, falls man das wollte)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
hossa. es klappt!

die geschichte mit culling ist bei diesem problem glaube ich nicht nützlich (höchstens um performance zu verbesseren?), da die geometrie mal rauf und dann wieder runder geht. die situation ist also so, dass mehrere flächen in die gleiche richtung (zum betrachter) zeigen, die hintere aber von der vorderen verdeckt sein soll.

soweit ich das culling verstehe werden einfach flächen(/linien bei glPolygonMode(.., GL_FILL)) welche von hinten gesehen werden nicht gezeichnet.


das glPolgonOffset habe ich auch nicht benötigt. aber danke für den tipp. :wink:


wie hab ichs jetzt gemacht:
die ganze geometrie wird weiterhin in 1 liste geschrieben.
das sieht etwa so aus: (is halt n c code)
Code:
  1.  
  2.     glDeleteLists(objects,1);
  3.     objects = glGenLists (1);
  4.     glNewList(objects, GL_COMPILE);
  5.  
  6.     glEnable(GL_DEPTH_TEST);
  7.  
  8.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
  9.  
  10.     glColor3f(0.1, 0.1, 0.1);
  11.  
  12.     glBegin(GL_TRIANGLES);
  13.     for( ii = 0; ii < (int)(fileData.fileHeight - step); ii += step ){
  14.         for( jj = 0; jj < (int)(fileData.fileWidth - step); jj += step ){
  15.             glVertex3f(-fileData.points[(int)ii][(int)jj]/100.0f, jj/100.0f, ii/100.0f);
  16.             glVertex3f(-fileData.points[(int)(ii+step)][(int)jj]/100.0f, jj/100.0f, (ii+step)/100.0f);
  17.             glVertex3f(-fileData.points[(int)ii][(int)(jj+step)]/100.0f, (jj+step)/100.0f, ii/100.0f);
  18.  
  19.             glVertex3f(-fileData.points[(int)(ii+step)][(int)(jj+step)]/100.0f, (jj+step)/100.0f, (ii+step)/100.0f);
  20.             glVertex3f(-fileData.points[(int)ii][(int)(jj+step)]/100.0f, (jj+step)/100.0f, ii/100.0f);
  21.             glVertex3f(-fileData.points[(int)(ii+step)][(int)jj]/100.0f, jj/100.0f, (ii+step)/100.0f); 
  22.         }
  23.     }
  24.     glEnd();
  25.  
  26.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  27.     glColor3f(0.2, 0.2, 0.2);
  28.     glLineWidth(1.5);
  29.     glBegin(GL_TRIANGLES);
  30.     for( ii = 0; ii < (int)(fileData.fileHeight - step); ii += step ){
  31.         for( jj = 0; jj < (int)(fileData.fileWidth - step); jj += step ){
  32.             glColor3f(fileData.points[(int)ii][(int)jj]/1024,
  33.                 fileData.points[(int)ii][(int)jj]/1024,
  34.                 fileData.points[(int)ii][(int)jj]/1024);
  35.             glVertex3f(-fileData.points[(int)ii][(int)jj]/100.0f, jj/100.0f, ii/100.0f);
  36.             glColor3f(fileData.points[(int)(ii+step)][(int)jj]/1024,
  37.                 fileData.points[(int)(ii+step)][(int)jj]/1024,
  38.                 fileData.points[(int)(ii+step)][(int)jj]/1024);
  39.             glVertex3f(-fileData.points[(int)(ii+step)][(int)jj]/100.0f, jj/100.0f, (ii+step)/100.0f);
  40.             glColor3f(fileData.points[(int)ii][(int)(jj+step)]/1024,
  41.                 fileData.points[(int)ii][(int)(jj+step)]/1024,
  42.                 fileData.points[(int)ii][(int)(jj+step)]/1024);
  43.             glVertex3f(-fileData.points[(int)ii][(int)(jj+step)]/100.0f, (jj+step)/100.0f, ii/100.0f);
  44.  
  45.             glColor3f(fileData.points[(int)(ii+step)][(int)(jj+step)]/1024,
  46.                 fileData.points[(int)(ii+step)][(int)(jj+step)]/1024,
  47.                 fileData.points[(int)(ii+step)][(int)(jj+step)]/1024);
  48.             glVertex3f(-fileData.points[(int)(ii+step)][(int)(jj+step)]/100.0f, (jj+step)/100.0f, (ii+step)/100.0f);
  49.             glColor3f(fileData.points[(int)ii][(int)(jj+step)]/1024,
  50.                 fileData.points[(int)ii][(int)(jj+step)]/1024,
  51.                 fileData.points[(int)ii][(int)(jj+step)]/1024);
  52.             glVertex3f(-fileData.points[(int)ii][(int)(jj+step)]/100.0f, (jj+step)/100.0f, ii/100.0f);
  53.             glColor3f(fileData.points[(int)(ii+step)][(int)jj]/1024,
  54.                 fileData.points[(int)(ii+step)][(int)jj]/1024,
  55.                 fileData.points[(int)(ii+step)][(int)jj]/1024);
  56.             glVertex3f(-fileData.points[(int)(ii+step)][(int)jj]/100.0f, jj/100.0f, (ii+step)/100.0f);
  57.         }
  58.     }
  59.     glEnd();
  60.  
  61.     glEndList();
  62.  


zuerst wird also der GL_DEPTH_TEST eingeschaltet
dann zuerst mit GL_FILL zeichnen
dann mit GL_LINE zeichnen und die glLineWidth erhöhen


das resultat ist wie gewollt.
die befehle:
glLineWidth(1.5);
glEnable(GL_DEPTH_TEST);
können auch im init code stehen.
bringt das was punkto performance od. macht es einfach nur mehr sinn?
macht der glLineWidth wirklich probleme mit der performance?


und noch was: wenn diese liste gross wird, hat das programm natürlich mühe
:roll:
muss ich da jetzt einen Vertexbufferobject basteln?
dann hab ich da noch was von einem verfahren zur reduktion entfernter geometrien gelesen :arrow: http://wiki.delphigl.com/index.php/Tutorial_Terrain3
bringts das wirklich? oder ist das vertexbufferobjekt wirksamer?

ps: vielen dank für die erhaltenen antworten und die noch folgenden :wink: . Dieses Forum ist einfach Klasse! Wie hätte ichs wohl ohne euch bis hierhin geschaft :?: :lol:


Zuletzt geändert von Astazan am Do Sep 20, 2007 15:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 15:04 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Boahh kannst Du mal bitte ein paar Zeilenumbrüche einfügen? die Breite Deines Codeabschnittes sprengt meinen Bildschirm.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 15:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
sorry. mein fehler.
hoffentlich passts jetzt :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 15:55 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Ja danke, so ists viel angenehmer.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 10:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Also wenn du da nur Quaderförmige Objekte (Häuser) hast wird dir der QuadTree nicht viel bringen.
Obwohl deine Zeichenroutine etwas Landschaftartiges vermuten lässt.

Frustum Culling könnte dir helfen.


Apropo Frustum:

Wird bei einer DisplayList oder beim VBO das aktuelle Frustum eigentlich berücksichtigt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Als erstes eine Bitte an alle. Falls ihr Fragen habt die nicht zum eigentlichen Thema passen, dann bitte eine neues Thema. Selbst wenn es nur etwas triviales ist. Denn erstens verliehrt man sehr schnell den Überblick und mir persönlich geht es so, wenn ich zu einem Thema nichts sagen kann dann lese ich es auch nicht mehr großartig mit. Und dann lauft ihr gefahr, dass eure am Rande gestellte Frage nicht beantwortet wird. Ich antworte jetzt noch aber alles neue bitte in neuem Thread. Sonst ist das Thema zu. ;)

LineWidth vs. Performance: Ja es stimmt. Die OpenGL Linien sind teilweise sehr Leistungsintensiv. Auch wenn sie eigentlich viel weniger Fläche haben. Aber ich vermute das liegt daran, dass die Grafikkarten auf Dreiecke optimiert werden. Und Linien sind eher auch nur in technischen Anwendugen oder Demos zu finden. Weswegen das für Spiele kaum Relevanz hat.

Astazan: Ich weiß nicht was du mit mühe meinst, da sich das aus deinem Code nur schlecht ablesen lässt. Aber DisplayListen sind statisch und sollten sie auch sein. Also solltest du es vermeiden sie ständig zu erstellen und zu löschen. Wenn du ständig ändernde Geometrie hast dann solltest du VBOs benutzen. Da die unter anderem darauf ausgelegt sind. Aber wenn du weitere Infos benötigst. Siehe OBEN. ;)

In deinem Falle ist es auch noch so, dass fast alle Linien doppelt gezeichnet werden. Denn PolygonMode ersetzt ein Dreieck durch 3 Linien und bei angrenzenden Dreiecken hast du 2 identische Linien die direkt an der selben Stelle liegen. Auch wenn du es nicht siehst hat deine Karte fast doppelt so viel zu arbeiten als eigentlich nötig wäre.

Frustrum: Normal spielt es keine Rolle ob die VertexDaten aus einer DL, VBO oder itterativ an die Karte geschickt werden. Zu mal auf neueren Karten in DLs auch VBOs benutzt werden können. Die Daten durchlaufen alle die selben Stationen auf der Karte. Allerdings auch wenn die Daten recht schnell verworfen werden können ist es doch meistens schneller wenn man sie gar nicht erst zeichnen lässt. Allerdings muss man aufpassen, dass man den Test nicht zu sehr ausufern lässt.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.010s | 14 Queries | GZIP : On ]