ich bin gerade dabei, einen Editor für meine Engine zu schreiben, und da soll man eben auch Objekte markieren können. Das Anklicken klappt dank der Tutorials schon ganz gut, und in einer Baumansicht wird die Markierung auch schon wunderbar hervorgehoben.
Jetzt will ich die Objekte aber auch noch in der 3D-Ansicht hervorheben, und habe mich zu einem roten Gitter um das Objekt entschieden. Das machen viele andere Editoren auch. Jetzt die Frage: Wie erstelle ich ein Gitter um ein Objekt? Ich habe weder im Wiki noch im Forum eine Antwort darauf gefunden. Also habe ich mir zwei Renderprozeduren pro Objekt geschrieben: Eine rendert mit Texturen, die andere als Gitter. Das ist sehr umständlich und auch nicht ganz sauber, aber dazu kommt noch eine Unschönheit:
Die Linien sind ziemlich hässlich. Und dazu kommt noch, dass das kein richtiges Rot ist - eher ein Kastanienbraun:
Ich weiß, richtig sehen kann man den Markierungsrahmen nicht. Aber das ist ja genau das Problem.
Jetzt die eigentliche Frage(n): Weiß jemand, wie man Objekte als Gitter rendert? Oder wie man einen Rahmen wenigstens schön malt - im Testprogramm seht ihr, dass er an manchen Stellen verschwindet. Und schließlich noch: warum ist die Farbe Kastanienbraun und nicht rot? Ich verwende glColor4f(255, 0, 0, 255).
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das mit dem Kastanienbraun könnte an einer noch gebundenen Textur liegen. Stell sicher, dass GL_TEXTURE_2D deaktiviert ist, wenn du die Linien zeichnest. Um Objekte als Wireframe zu zeichnen, schau mal in den Artikel glPolygonMode rein. Allerdings empfehle ich dir, eher nur eine Bounding Box zu zeichnen, je nach OpenGL implementation sind Linien nicht sehr performant und wenn du dann ein hochauflösendes Objekt hast, ist das nicht sooo toll.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Yogu hat geschrieben:
Jetzt die eigentliche Frage(n): Weiß jemand, wie man Objekte als Gitter rendert? Oder wie man einen Rahmen wenigstens schön malt - im Testprogramm seht ihr, dass er an manchen Stellen verschwindet.
Ich würde es mal so probieren: Erster Renderpass mit glPolygonMode(GL_FRONT_AND_BACK, GL_FILL), Tiefentest aus oder auf GL_LEQUAL, glPolygonMode(GL_FRONT_AND_BACK, GL_LINE), Zweiter Renderpass.
Zitat:
Und schließlich noch: warum ist die Farbe Kastanienbraun und nicht rot? Ich verwende glColor4f(255, 0, 0, 255).
1. glColor mit f erwartet eine Gleitkommazahl zwischen 0 und 1. Da die Farbe darauf beim Schreiben in den Farbpuffer beschränkt wird, macht das aber eigentlich noch nichts aus. Denn:
2. Du musst die Textur wieder rausnehmen: glDisable(GL_TEXTURE_2D) oder glBindTexture(GL_TEXTURE_2D, 0).
Ansonsten zeichnet er Endfarbe = Color * Textur. Was wahrscheinlich auch der Grund ist, warum es so seltsam aussieht.
21:06 Danke für die schnellen Antworten! Ich schaue mir das mal an...
21:13 Hey, das mit Texturen deaktivieren funktioniert schonmal. Jetzt ist es wirklich Rot! Danke
22:00 Jetzt klappt alles. Ich bin fertig - was für ein Wunder! Ein schöner roter Rahmen um das markierte Objekt - ohne gestrichelt.
Hallo,
das hier mal als Zeittafel
Ich mache das ganze jetzt folgendermaßen: Zuerst setze ich die Farbe, dann setze ich die Pinselstärke. Um zu beginnen, wechsle ich in den Polygon-Modus GL_LINE, stelle die Texturen ab und deaktiviere den Tiefentest (GL_LEQUAL wäre zwar schöner, aber leider werden da wieder Teile nicht gezeichnet, wenn ich die Ansicht drehe). Dann rendere ich die Boundig Box, mache es mir aber noch einfach: Ich zeichne einen 1x1 großen Würfel. Ich werde später sicher eine echte Bounding Box verwenden. Schließlich stelle ich wieder alle Einstellungen zurück.
Danke an euch beide, Lord Horazont und WhiteHunter! Ihr habt mir sehr geholfen.
jetzt habe ich ein wenig weitergearbeitet und zeichne schließlich doch das gesamte Objekt als Gitternetz. Ich habe einfach nur die Farb-Anweisung im Oberflächen setzen weglassen müssen, und vorher die Texturen deaktivieren müssen. So klappt alles - aber leider ist das mit dem Tiefentest noch nicht so ganz gut.
Wenn ich den Tiefenpuffer deaktiviere, klappt alles - aber es werden eben manche Linien gezeichnet, die eigentlich nicht sichtbar sein dürften. Und das schlimme: Nicht alle Linien sind unnötigerweise noch da, sondern nur die, die nicht vor anderen Objekten gezeichnet werden. Sprich: manche
Wenn ich aber den Tiefentest aktiviere und auf Kleiner/Gleich stelle, dann ist die Linie nicht durchgängig, sondern wird nach dem Drehen der Kamera an einigen Stellen unterbrochen.
Weiß jemand, woran das liegt? Oder ist das eben so?
Danke im Vorraus.
Der aktuelle Editor zum Testen Hier sieht man schön, dass manche Linien gezeichnet werden, und manche nicht. Das führt zu einem "unsauber zusammengeklebt"-Effekt (so sieht es für mich aus). Weil eine Linie fehlt sind die Schnittpunkte der anderen an einer falschen Stelle.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich glaube, da wirst du nicht viele Chancen haben, das zu beheben. Vielleicht könnte man was rausholen, indem man die Auflösung des Tiefenpuffers erhöht, aber das ist auch nicht unbedingt das gelbe vom Ei.
Was du als alternative noch ausprobieren könntest, manuell ein um die Vertexnormalen extrudiertes Mesh zu erzeugen, welches eben außen um das Objekte herum "schwebt"...
Aber was mir gerade eingefallen ist und was auf jeden fall ein Versuch wert sein sollte, ist die glPolygonOffset-Funktion. Damit kannst du den Tiefenwert der Fragmente manipulieren. Probier mal, glPolygonOffset(0, 1); zu verwenden (für die Linien).
//Edit: Vergiss nicht, mit glEnable GL_POLYGON_OFFSET_LINE zu aktivieren.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Danke für deine Mühe, Lord Horazont, aber leider will das auch nicht so richtig. Es wird sogar fast noch schlimmer
Ich lass den Tiefenpuffer jetzt einfach mal deaktiviert. Wenn jemand aber noch ein Lösungsvorschlag oder -anfang hat, ich würde mich sehr darüber freuen.
Registriert: Mi Mär 09, 2005 15:54 Beiträge: 372 Wohnort: München
Programmiersprache: Delphi, C#, FPC
Hast du glPolygonOffset auch mit verschiedenen Werten ausprobiert, z.B. glPolygonOffset(-1, 2)? Probiers mal mit negativen Werten. Könnte mir vorstellen, dass es dann funktioniert. Ist aber nur eine Vermutung.
Was du auch machen könntest, wäre die Liniendicke mit glLineWidth z.B. auf 2 zu setzen. Weiß gerade nicht, ob du dafür mit glBegin(GL_LINES) arbeiten musst, aber probiers mal.
Der erste Parameter ist ein Faktor, mit dem der Tiefenwert multipliziert wird, bevor er verglichen/geschrieben wird. Falls nicht irgendwelche Sonderfälle vorliegen, sollte dieser Wert 1(oder etwas kleiner als 1) sein, aber immer positiv, da sonst der Tiefenwert negativ wird. 0,5 würde den Rahmen dann auf die Hälfte der Entfernung des Objektes setzen.
Der zweite Wert ist ein Maß für eine feste Addition auf den Tiefenwert, und zwar multipliziert mit einer internen Konstanten, die so groß gewählt ist, dass ein Wert von 1 gerade eben noch garantiert eine Veränderung des Tiefenwertes bewirkt (kein z-Fighting mehr). Auch hier sollte ein Wert von 1 genügen, um sinnvolle Ergebnisse zu erreichen (kann auch -1 sein, bin mir jetzt wegen dem Vorzeichen hier nicht ganz sicher). Sollte das Fighting so noch nicht weg sein, kann man auch größere Werte nehmen, aber zuviel des Guten schadet hier nur.
Ich hab polygonOffset schon öfter benutzt und finde diese Funktion äußerst nützlich.
glLineWidth ist mbMn entfernungsabhängig, d.h. die Linie wird nach hinten dünner, was den Effekt wieder zunicht macht.
_________________ 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.
ich habe gestern leider keine Zeit mehr gehabt, euch zu antworten. Deshalb hole ich es jetzt nach.
Erstmal danke für die neuen Antworten!
littleDave hat geschrieben:
Hast du glPolygonOffset auch mit verschiedenen Werten ausprobiert, z.B. glPolygonOffset(-1, 2)? Probiers mal mit negativen Werten. Könnte mir vorstellen, dass es dann funktioniert. Ist aber nur eine Vermutung.
Ich habe schon mit allen möglichen Werten rumprobiert, aber wirklich etwas brauchbares kam nie raus. Es gab immer noch ein paar Stellen, die nicht gezeichnet wurden - vor allem Flächen, die in einem Würfel waren. Also in holen Räumen.
littleDave hat geschrieben:
Was du auch machen könntest, wäre die Liniendicke mit glLineWidth z.B. auf 2 zu setzen. Weiß gerade nicht, ob du dafür mit glBegin(GL_LINES) arbeiten musst, aber probiers mal.
Liniendicke klappt ganz gut - aber das ist auch nicht so wirklich schön. Eine Umrandungslinie sollte auf jeden Fall nur ein Pixel breit sein. Außerdem klappt das innerhalb von Objekten auch nicht.
Evil-Devil hat geschrieben:
Hmm, hab nach dem starten > 2.000 FPS, mit der Textur dann ~1500 und mit der Outline dann ~1400. Geht doch
Die FPS wundern mich auch ziemlich. In einem normalen "Spiel" (Ein Raum mit drehendem Quader drin) habe ich maximal 60 FPS, im Editor kann ich noch so viele Objekte erstellen, und manchmal bekomme ich trotzdem ca. 2000 FPS. Es schwankt außerdem ziemlich. Ich denke, das ist nicht so ganz ein echter FPS-Wert, aber so ungefähr müsste er ja stimmen
Evil-Devil hat geschrieben:
Ich seh gerade, das die FPS Anzeige nur aktualisiert wird, wenn man ins 3D Fenster klickt. Sonst bleibt die immer gleich.
Dazu gibt es die Option Tools > Permanent rendern
Standardmäßig ist das deaktiviert - warum sollte ich ständig rendern? Das braucht nur Prozessorleistung, und der Editor soll schließlich auch im Hintergrund laufen können. Wenn du ins Fenster klickst, kannst du etwas markieren, und dann muss eben gerendert werden. Außerdem wird gerendet, wenn du dich bewegst (Rechte und Mittlere Maustaste, Mausrad), wenn du das 3D-Fenster in der Größe veränderst (also auch bein Splitter-Bewegen) und beim Neuzeichnen, das Windows verordnet. Und eben beim Ändern der Auswahl in der Baumansicht (genauer: Beim MouseUp).
Oder gibt es bei dir einen Bug, z. B. dass bestimmte Aktionen nicht gerendert werden, und erst beim Klicken angezeigt werden?
@Sidorion: Besonderen Dank für deinen Beitrag. Jetzt verstehe ich endlich die Parameter - aus dem Wiki bin ich nicht so ganz schlau geworden.
Leider klappt es nicht so ganz, wie ich will. Obwohl ich sehr viel ausprobiert habe, gibt es doch immer wieder noch Schönheitsfehler. Und innerhalb von Objekten sehe ich nur einige Punkte - wenn ich Glück habe. Das ist nicht schön...
Sidorion hat geschrieben:
glLineWidth ist mbMn entfernungsabhängig, d.h. die Linie wird nach hinten dünner, was den Effekt wieder zunicht macht.
Das sehe ich anders Bei mir ändert sich die Liniendicke auch bei Stärke 2 nicht.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Yogu hat geschrieben:
Evil-Devil hat geschrieben:
Hmm, hab nach dem starten > 2.000 FPS, mit der Textur dann ~1500 und mit der Outline dann ~1400. Geht doch
Die FPS wundern mich auch ziemlich. In einem normalen "Spiel" (Ein Raum mit drehendem Quader drin) habe ich maximal 60 FPS, im Editor kann ich noch so viele Objekte erstellen, und manchmal bekomme ich trotzdem ca. 2000 FPS. Es schwankt außerdem ziemlich. Ich denke, das ist nicht so ganz ein echter FPS-Wert, aber so ungefähr müsste er ja stimmen
Das liegt daran, dass du bei dem "Spiel" vermutlich VSync an hast, d.h. die FPS sind auf die Wiederholfrequenz des Bildschirms beschränkt. Beim Editor ist das scheinbar nicht der fall, daher die hohen Zahlen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Evil-Devil hat geschrieben:
@VSync: Bei mir immer Treiberseitig deaktiviert.
Ih. Ich mag die Streifen nicht, die dabei manchmal entstehen
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.