opengl: Farbverlaub eines Dreiecks beeinflussen
-
Wie kann ich den Farbverlauf eines Dreiecks beeinflussen?
Warum: Ich möchte die Höheninformations als Farbwert auf der Oberfläche wiedergeben. Dafür habe ich eine eigene Farbpalette. (Kleine Werte als Blau, mittlere als Grün, ...) Bei kleinen Flächen, die nicht so steil ansteigen, kann ich den automatischen Farbverlauf von OpenGL verwenden - die ungenauigkeiten fallen nicht auf. Aber in steilen Abschnitten werden manche Übergänge übersprungen.
Hat jemand eine Idee, wir ich den Farbverlauf auf meine Farbpalette zwingen kann?
Danke, Sven
-
du benutzt eine eindimensionale textur die deinen farbverlauf enthaelt und weisst deinen vertices eine texturkoordinate entsprechend ihrer hoehe zu.
-
hellihjb schrieb:
du benutzt eine eindimensionale textur die deinen farbverlauf enthaelt und weisst deinen vertices eine texturkoordinate entsprechend ihrer hoehe zu.
Fast. Leider liegen meine Dreiecke frei im Raum und die Kanten haben unterschiedlich Winkel. Damit müsste ich für jede Kante ein eigene Textur angeben.
Geht das?
Sven
-
bitte erklaer' nochmal praezise was du erreichen moechtest.
-
hellihjb schrieb:
bitte erklaer' nochmal praezise was du erreichen moechtest.
ich probiere es:
Meine Geometrie ergibt sich aus einer mathematischen Formel. Die Farben der Oberfläche ergeben sich aus einer weiteren Formel; im einfachsten Fall Z bzw. Höhenwerte, so dass man beim Blick von oben keine Art Landkartenansicht bekommt.
(Täler=Blau, Berge=Rot, Flachland=Grün)Um einen möglichst größen Werte bereich abbilden zu kommen laufen die Farben von
Blau über Grün nach Rot.
Blau => kleinster Wert
Grün => Mitte
Rot => Größter WertZwischen Blau und Grün Bzw. Grün und Rot lasse ich interpolieren.
Ich ermittle die darzustellenden (Farb-)Werte nur an den Ecken der Flächen. Die Einfärbung der Fläche geschied z.Z. über die Farb-Interpolation von OpenGl
Jetzt mein Problem:
Das Problem entsteht, wenn innerhalb einer Fläche zwischen einem sehr kleinen und einem sehr großen Wert interpoliert werden muss. Also von Blau nach Rot. Auf dem halbem Weg erscheint ein Lila Farbverlauf, der eigendlich nicht Teil meiner Farbtabelle ist.
Mit einer benutzer definiten Interpolation könnte ich auch folgenge Idee realisieren:
Im nächsten Schritt möchte ich, dass die Farben in groberen Stufen interpolieren, so dass man beim Blick von oben Höhenlinien erkennen kann. (Beispiel: der Farbstreifen mit dem einen Grünton steht für den Wertebereich von 0.45 - 0.55)Sven
-
Wenn du die Interpolation von OpenGL benutzest, musst du wohl Zwischenschritte einbauen, an denen die Vertices von dir bestimmte Farben haben.
-
Hallo Sven,
tu' mal so wie ich oben beschrieben habe.
Die eindimensionale Textur ist nichts anderes als eine Farbpalette und verhindert, dass die RGB-Anteile (Deiner Vertexfarbe) unabhaengig voneinander interpoliert werden.
Es sollte allerdings gegeben sein, dass der Parameter aus dem sich die Farbe ergibt, linear ueber das Polygon verlaeuft (ist gegeben bei Hoeheninformationen).
Die "Palette" erfuellt auch leicht Deine zweite Anforderung, "die Farben in groberen Stufen zu interpolieren".
In wie weit glaubst Du, dass Dein Einwand ("Leider liegen meine Dreiecke frei im Raum und die Kanten haben unterschiedlich Winkel") diesem Konzept widerspraeche?
-
hellihjb schrieb:
...
Es sollte allerdings gegeben sein, dass der Parameter aus dem sich die Farbe ergibt, linear ueber das Polygon verlaeuft (ist gegeben bei Hoeheninformationen).
Die "Palette" erfuellt auch leicht Deine zweite Anforderung, "die Farben in groberen Stufen zu interpolieren".
In wie weit glaubst Du, dass Dein Einwand ("Leider liegen meine Dreiecke frei im Raum und die Kanten haben unterschiedlich Winkel") diesem Konzept widerspraeche?Wenn ich genauer darüber nachdenke hast Du natürlich recht, dass die Höheninformation linear über die Fläche läuft. Vielleicht habe ich mich von meiner zu allgemein gehaltenen Programmstruktur verwirren lassen. Die Funktion, die die Farbwerte ermittelt, könnte beliebige Werte zurück liefern. Sie liefert z.Z. jedoch immer die Höheninfomation, welche natürlich linear ist. Dies kann ich aus meiner Struktur jedoch z.Z. so noch nicht erkennen -> werde ich ändern.
Jetzt nur noch der Vollständigkeit wegen - Es interresiert mich halt.
Wenn die Farbwerte aus einer externen Funktion kämen z.B. f(u,v) hätte ich eine Alternative?
Sven
-
Die Funktion, die die Farbwerte ermittelt, könnte beliebige Werte zurück liefern.
Sie liefert z.Z. jedoch immer die Höheninfomation, welche natürlich linear istworaus setzt sich das ergebnis dieser funktion denn zusammen?
es liegt ja in der natur des polygons, linear zu sein...Wenn die Farbwerte aus einer externen Funktion kämen z.B. f(u,v) hätte ich eine Alternative?
ich weiss jetzt nicht ganz genau worauf du hier hinaus willst.
in dem speziellen fall f(u,v) wuerde man einfach jedem eckpunkt die gegebenen parameter u,v als texturkoordinaten mitgeben und aus einer zweidimensionalen textur den entsprechenden (quasi vorberechneten) farbwert erhalten.
alternativ liesse sich eine solche funktion auch als pixelshader realisieren.