PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Farben ändern in OpenGL


Dee
2003-10-06, 00:51:25
Hallo, da bin ich wieder!

Das Problem ist nicht ganz so trivial, zumindest weiß ich keine Lösung! *g* Nehmen wir an, ich erstelle ein Objekt, welches definiert wird mit den Farben blau und gelb. Dieses wird oft wiederholt gebraucht und auch verwendet. Manche Objekte davon sollen aber nun ein etwas helleres blau bekommen. Wie kann ich vor dem Einbinden mit glCallList(object) die blaue Farbe aufhellen? Die gelbe soll dabei aber bleiben! (Zur Not würde ich auch das ganze Objekt mit leichtem gelb einfärben, dann wird das blau ja auch heller...)

Wenn das nicht geht, hat jemand eine Ahnung, wie ich mein Problem lösen könnte? Es geht darum, daß manche Objekte markiert werden können und die dann heller sein sollen.

Idee: Ich definiere mir nochmal das gleiche Objekt in hellblau und füge das eben ein, wenn es markiert ist. Muß dann blöderweise ein Objekt zweimal definieren, vielleicht geht's ja schöner! :)

Gruß, Dee

Kant
2003-10-06, 01:20:35
Wenn du die Display-Listen beibehalten willst, wäre eine Möglichkeit die, die Liste zu splitten.
Also statt eine Liste pro Object erstellst du 2. Eine mit den Flächen in Blau, und eine mit denen in gelb. Dabei nimmst du die Farb-Defintion aber nicht mit in die DisplayListe. Der Aufruf wäre dann entsprechend

glColor3f(0.0f,0.0f,1.0f);glCallList(Blaues);
glColor3f(0.8f,0.8f,0.0f);glCallList(Gelbes);

Zwar umständlicher, aber Farbänderungen sollten dann kein Problem mehr sein.

Dee
2003-10-07, 10:55:18
Ich hab es nun so gemacht und die Liste gesplittet. Gefällt mir zwar nicht ganz so sehr, da mein Objekt nun "geteilt" ist und in einzelnen Komponenten aufgerufen wird, aber was soll's...

Dann noch ein Problem: Wieso zeichnet GL_POLYGON keine Sterne oder ähnliches? Immer wenn ich versuche ein Polygon zu zeichen, was quasi irgendwo eine Ecke nach innen hat, dann wird das ignoriert und grundsätzlich nur die transitive Hülle der Eckpunkte gezeichnet... Oder muß man etwas bei der Reihenfolge beachten???

Und gibt es die Möglichkeit zu einem Object einen Rand zeichnen zu lassen. Derzeit zeichne ich diesen noch per Hand. Dieser liegt, da ich ihn vor dem Objekt zeichne, vor dem Objekt, was okay ist. Betrachte ich das aber nun von hinten, liegt der Rand dahinter und ist nur noch stückchenweise zu sehen. Gibt es dafür irgendwas, daß der Rand egal aus welcher Perspektive immer vorn ist?
Ach ja, Depth Test kann ich leider nicht ausschalten, da ich diesen dennoch noch brauche...

Gruß, Dee

Kant
2003-10-07, 18:32:07
Original geschrieben von Dee
Ich hab es nun so gemacht und die Liste gesplittet. Gefällt mir zwar nicht ganz so sehr, da mein Objekt nun "geteilt" ist und in einzelnen Komponenten aufgerufen wird, aber was soll's...

Es geht auch mit nur einer Liste (Wenn du nur eine Farbe ändern willst).
Bei der Definition der DL-Liste erst die blauen-Flächen nehmen (ohne die Farbe in der DL zu definieren), dann mit glcolor auf gelb wechseln, und den rest dazu (Alles in dieselbe Liste).
Aufruf dann mit
glColor3f(0.0f,0.0f,1.0f);glCallList(Ding);

Original geschrieben von Dee
Dann noch ein Problem: Wieso zeichnet GL_POLYGON keine Sterne oder ähnliches? Immer wenn ich versuche ein Polygon zu zeichen, was quasi irgendwo eine Ecke nach innen hat, dann wird das ignoriert und grundsätzlich nur die transitive Hülle der Eckpunkte gezeichnet... Oder muß man etwas bei der Reihenfolge beachten???

Und gibt es die Möglichkeit zu einem Object einen Rand zeichnen zu lassen. Derzeit zeichne ich diesen noch per Hand. Dieser liegt, da ich ihn vor dem Objekt zeichne, vor dem Objekt, was okay ist. Betrachte ich das aber nun von hinten, liegt der Rand dahinter und ist nur noch stückchenweise zu sehen. Gibt es dafür irgendwas, daß der Rand egal aus welcher Perspektive immer vorn ist?
Ach ja, Depth Test kann ich leider nicht ausschalten, da ich diesen dennoch noch brauche...

Gruß, Dee
Mit Polygonen mache ich eigentlich nie etwas. Ich würde dir empfehlen die Polys selbst zu triangulieren, und nur Dreiecke zur GraKa zu schicken. So behält man die meiste Kontrolle über die Geometrie. Und die Einschränkung, das die polys keine "Ecken nach Innen" haben dürfen ist normal.

Bei der Sache mit dem Rand verstehe ich nicht so ganz, was das Problem ist. ?

DocEW
2003-10-07, 20:08:21
Original geschrieben von Dee
Dann noch ein Problem: Wieso zeichnet GL_POLYGON keine Sterne oder ähnliches? Immer wenn ich versuche ein Polygon zu zeichen, was quasi irgendwo eine Ecke nach innen hat, dann wird das ignoriert und grundsätzlich nur die transitive Hülle der Eckpunkte gezeichnet...
Du meinst die konvexe Hülle! =) Ja, mit GL_POLYGON kann man nur konvexe Objekte erstellen. Und was nicht konvex ist, wird konvex gemacht...

Dee
2003-10-07, 20:27:37
Hallo!

Eben die von Dir beschriebene Vorgehensweise mit glColor und danach glCallList, worin man wieder die Farbe ändert, hat das Problem mit dem Rand.

Nehmen wir an, ich hab ein Einheitsquadrat in der z-Ebene. Um dieses lege ich mit Lineloop einen weißen Rand. Das alles steht in der Liste, die ich später aufrufe.

Ist in dieser Liste erst der Rand und dann das Quadrat, wird die Farbe vor glCallList logischerweise ignoriert und das Quadrat ist ebenfalls weiß.

Ändere ich die Reihenfolge ist vom Rand nicht mehr viel zu sehen, bis auf an zwei Seiten. Die anderen werden von blauen Quadrat überdeckt.

Ich hoffe, das Problem ist jetzt klarer. Ansonsten zeige ich gern Bilder, was ich meine... :)

Gruß, Dee

Kant
2003-10-07, 20:35:29
Welche DepthFunc hast du denn eingesetzt : GL_LESS oder GL_LEQUAL ?
Mit GL_LEQUAL sollte es eigentlich gehen, das du den Rand am Ende zeichnest. Damit wird der Framebuffer auch bei gleichen Z-Werten überschrieben.

Dee
2003-10-09, 22:06:43
Ah, danke, das war's! :bounce: Hätte ich eigentlich selbst drauf kommen können. Und nun kann ich sogar wieder alle drei verschiedenfarbige Teile des Objekt in eine Liste stecken und aufrufen... Herzlichen Dank also! Jetzt sieht das ganze schon viel besser aus.

Gruß, Dee