Ich bin inzwischen soweit, dass ich in mein Programm Konturen einlesen kann. Mittels dieser Konturen erzeuge ich Displaylisten. Funktioniert auch recht gut, bis ich in den sw-Modus wechsel. Ich weiß nicht, wie ich die Silhoutte zeichnen soll.
Bislang habe ich die Formen immer Weiß als Fläche gezeichnet. Dann noch einmal die Kanten, die ich benötige in schwarz hinterher gezeichnet. Hierbei habe ich mittels Augpunkt und den Flächenvektoren entschiden, welche Kante gezeichnet werden muss. Da ich aber nun vorher die Displaylists erstelle kenne ich den Augpunkt nicht und kann die Silhouttekanten nicht vorher berechnen. Hat jemant eine Idee???
Gruß Bomberbb
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Eine einfache Möglichkeit, Sillhouetten zu zeichnen, ist den Tiefentest auf GL_LEQUAL einzustellen, das Face Culling auf Front Face Culling umzustellen, GL_LINE als PolygonMode einzustellen und das Objekt zu zeichnen.
Habe mal ein bissel probiert, wie ich mir das denke.
Code:
glDepthFunc(GL_LEQUAL);
glEnable(GL_CULL_FACE);
glCullFace(Gl_FRONT);
glPolygonMode(GL_FRONT, GL_LINE);
glBegin(GL_QUADS);
..
glEnd;
Nun sehe ich von der Form nur noch die Rückseite als Linien, Muss ich nun das ganze noch mal als Flächen davor zeichnen???
ober war das anders gemeint, dass es eine Einstellung gibt, mit der ich nicht zweimal, sondern nur einmal zeichnen muss???
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das problem bei dieser Methode ist, dass man nicht sicher sein kann, dass die Vorderen polygone zuerst in den Tiefenpuffer geschrieben werden. Deshalb kanns wie beschrieben passieren, dass man dann einfach nur die Rückseite sieht.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Stimmt, man muss zuerst mit richtigem Face Culling der Flächen zeichnen, hatte ich vergessen zu erwähnen. Mit der Methode geht es soweit ich weiß nicht ohne alles zwei mal zu zeichnen.
Das klappt nun eigendlich alles so, wie es soll. (Mit zweimal zeichnen) Allerdings schimmern ab einer gewissen Entfernung die hinteren Linien durch die Flächen....
Habe gesehen, dass sich das bei entsprechendem Farclipping ändert, aber dann scheint es bei anderen Entfernungen durch.
Was kann ich da machen???
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Flimmern die Linien?
Das kommt durch die Auflösung des Tiefenpuffers. Wenn du statt 16 mal 24 oder 32bit verwendest, kannst du den effekt weit nach hinten rausschieben. Eine Erkärung findest du unter ZFighting im Wiki.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Nein, es flimmert nicht. Habe aber festgestellt, dass es nicht die Hinterkanten des Objekts sind, sondern die Kanten von Objekten, die sich noch dahinter befinden.
Ich habe das Problem als Bild angehangen. Ich habe mit der Methode zwei Zylinder ineinandergezeichnet. Einmal mit Radius 10 und einmal mit 9.5. Wenn ich nah ran zoome ist alles ok. Wenn ich weiter weg gehe scheint der innere Zylinder durch. Vor allem gibt es hier die Probleme wie man sieht im Randbereich....
Die Auflösung meines Tiefenpuffers beträgt 32 bit.
Ich habe nun schon einiges probiert auch mit zFar/zNear, Polygonoffset... aber es wird nicht besser.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Und nochwas, die Elemente, die durchscheinen sind nur Linien. Wenn ich den inneren Zylinder komplett in schwarz und mit GL_FILL zeiche scheint nichts durch!!!
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und wenn du denn äußeren einfärbst scheint dann immer noch was durch? Ich frag mich gerade ob die Linien nicht vielleicht überreste vom außenzylinder sein könnten. In jedem Fall ist es unschön.
Könntest du deinen Silhoutte-Zeichen-Code mal hier posten. Einerseits isses sicherlich interessant zu sehen wie du's gemacht hast, andererseits sieht man vielleicht doch noch ein Fehlerchen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
So, ich habe die Zeichenprocedure mal zusammengefasst. Die ist im Orginal noch um einiges umfangreicher, da man z.B. zwischen SW und Texturdarstellung umschalten kann. Aber ich denke hier ist das wichtigste drin.
Zur groben Erklärung:
OGLZylinder berechnet die Daten des Zylinders und schreibt diese in ein selbstdefiniertes Array. OGLrund beeinflusst hierbei , ob dieser Zylinder nach her als Zylinder mit Silhouette orde als Vieleck mit allen kanten gezeichnet wird.
Das eigendliche Zeichnen läuft dann wie folgt ab:
1: Zeichnen der Flächen in Weiß um nicht sichtbare Hinterkanten zu verdecken.
2: Zeichnen der Kanten in schwarz, die auf jeden Fall sichtbar sind.
3: Zeichnen der Kanten die zur Silhouette gehören
mit:
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.