ich benutze GL_LINE_STRIP um Linien darzustellen und möchte nun jeden Teil der Linie (jeden Vertex quasi) in einer anderen Farbe einfärben. Bis jetzt habe ich das über eine Schleife gemacht:
Code:
glShadeModel(GL_FLAT);
glBegin(GL_LINE_STRIP);
for I := 1 to Count - 1 do begin
glColor3ub(...,...,...);
glVertex3fv(...,...,...);
end;
glEnd;
Jetzt habe ich mir eine 1D Textur erzeugt, die alle von mir benötigten Farben (Spektrum) enthält und dann lege ich diese Textur über die Vertexe:
Code:
glEnable(GL_TEXTURE_1D);
glBindTexture(GL_TEXTURE_1D, TexID);
glColor3ub(255,255,255);
glBegin(GL_LINE_STRIP);
for I := 1 to Count - 1 do begin
glTexCoord1f(...);
glVertex3fv(...,...,...);
end;
glEnd;
Soweit funktioniert das sehr gut. Nur leider gibt es manchmal die Situation, dass der Folgevertex einige Farben überspringt und eine ganz andere Farbe hat. Jetzt wird die Textur aber über die beiden Vertexe gelegt und es tauchen auf der Linie mehrere Farben auf. Kann man bei OpenGL, ähnlich wie beim glShadeModel(GL_FLAT), dieses Verhalten umgehen? Nachher sollte jeder Vertex in einer Farbe erscheinen, also quasi ein Pixel der Textur.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
j0hnnie hat geschrieben:
Hallo Forum,
ich benutze GL_LINE_STRIP um Linien darzustellen und möchte nun jeden Teil der Linie (jeden Vertex quasi) in einer anderen Farbe einfärben. Bis jetzt habe ich das über eine Schleife gemacht:
Code:
glShadeModel(GL_FLAT);
glBegin(GL_LINE_STRIP);
for I := 1 to Count - 1 do begin
glColor3ub(...,...,...);
glVertex3fv(...,...,...);
end;
glEnd;
Jetzt habe ich mir eine 1D Textur erzeugt, die alle von mir benötigten Farben (Spektrum) enthält und dann lege ich diese Textur über die Vertexe:
Code:
glEnable(GL_TEXTURE_1D);
glBindTexture(GL_TEXTURE_1D, TexID);
glColor3ub(255,255,255);
glBegin(GL_LINE_STRIP);
for I := 1 to Count - 1 do begin
glTexCoord1f(...);
glVertex3fv(...,...,...);
end;
glEnd;
Soweit funktioniert das sehr gut. Nur leider gibt es manchmal die Situation, dass der Folgevertex einige Farben überspringt und eine ganz andere Farbe hat. Jetzt wird die Textur aber über die beiden Vertexe gelegt und es tauchen auf der Linie mehrere Farben auf. Kann man bei OpenGL, ähnlich wie beim glShadeModel(GL_FLAT), dieses Verhalten umgehen? Nachher sollte jeder Vertex in einer Farbe erscheinen, also quasi ein Pixel der Textur.
Vielen Dank und Grüße, John
klingt für mich so als ob du die Texturkoordinaten falsch setzt probier mal
vielen Dank für die Antworten. Ein array mit den Farbwerten benutze ich bereits, also eigentlich ist der Aufruf vor jedem Vertex glVertex3ubv(@Palette[I]), aber die Variante mit der Textur ist deutlich schneller (bei der Anzahl an Punkten etwa 30% mehr FPS). Die Texturkoordinaten berechne ich schon korrekt, also vom Prinzip her ist das Ergebnis ja schon fast perfekt. Wenn ich z.B. statt GL_LINE_STRIP GL_POINTS verwende, dann sehe ich, dass die Farben alle korrekt sind. Nur der "Verlauf", der durch GL_LINE_STRIP impliziert wird, stört mich. Achja und ich nutzte für die Textur auf GL_NEAREST für beide Filter.
Wenn ich das richtig verstanden habe, hast du in der Textur die Farbwerte, aber die Farbwerte der aufeinanderfolgenden Vertices sind nicht in der Textur aufeinanderfolgend. Dadurch würden beim Zeichnen auch die Texel zwischen den beiden gewünschten verwendet werden, was du aber nicht willst. Mit einem Shader könnte man das sehr leicht machen, indem du den Texturelookup im Vertex-Shader machst und die Farbe an den Fragment-Shader übergibts (die dabei interpoliert wird).
Wenn du nicht das oben Genannte willst, wäre zum besseren Verständnis ein erklärendes Bild hilfreich.
Auf der Gerade zwischen zwei Vertices bekommst du immer die Interpolation zwischen den beiden Vertices. Also die Texturkoordinaten werden interpoliert. Mit GL_NEAREST solltest du eigentlich das gewünschte Ergebnis kriegen, wenn du die Texturkoordinaten entsprechend setzt.
Also die Mitte eines Texels in der Textur hat die folgende Koordinate:
Code:
(0.5 + texel) / textureSize
Also bei einer Textur der Größe 4 wären das 0.125, 0.375, 0.625 und 0.875.
Die Mitte eines Texels willst du nun aber nicht auf einem Vertex haben, sondern in der Mitte der Linie. Dann sorgt GL_NEAREST dafür das die komplette Linie den gleichen Texel benutzt. Also der eine Vertex braucht texel-0.5, der andere texel+0.5. Letztlich läuft es also einfach auf
@Schläfer: Jupp. An Shader habe ich auch bereits gedacht, allerdings soll die Software auf PCs möglichst flüssig laufen, auf denen keine Shader unterstützt werden. Und auf den PCs, die Shader unterstützen, läuft die Software bereits flüssig genug^^ Also ich dachte man könnte die paar Farben, die ich brauche, in eine Art Palette von OpenGL laden und die Farben dann nur noch aus dieser Palette aufrufen. Und das ohne Shader. Da schienen mir die Texturen recht sinnvoll. Bis auf die Interpolation :/
@Coolcat: Das Problem bleibst doch dann das gleicher oder? Wenn auf den Vertex i der Texel j und auf Vertex i+1 der Texel j+2 gemappt wird, haben ich zwischen den Vertexen eine Interpolation von Texel j bis Texel j+2 und ungewollt auch Texel j+1 mit dargestellt.
@Coolcat: Das Problem bleibst doch dann das gleicher oder?
Nein, auf die Vertices mappst du genau den Punkt zwischen zwei Texeln. Auf Vertex 0 wird der Texel -0.5 gemappt. Vertex 1 bekommt Texel 0.5 usw. Das GL_NEAREST sorgt dann dafür das keine lineare Interpolation stattfindet. Benutze einfach die "Formel" in meinem vorherigen Post.
@Coolcat: Also das Prinzip habe ich verstanden, aber wenn sich die Vertexe nun um mehrere Texel unterscheiden, dann habe ich ja immer noch die Interpolation mit drin. Also sagen wir mal habe eine Textur mit Weiß, Blau, Grün, Rot und Schwarz. Nun hat jeder Vertex einen Wert (Value) zwischen 0 und 10 und diese will ich farblich darstellen (ohne deine Formel):
Code:
glBegin(GL_LINE_STRIP);
for I := 0 to Count - 1 do begin
glTexCoord1f(Item[I].Value/10);
glVertex3fv(@Item[I].Vertex[0]);
end;
glEnd;
Wenn jetzt drei Vertexe habe: Vertex 0 mit Value 0, Vertex 1 mit Value 0 und Vertex 3 mit Value 10. Nun erhalte ich eine weiße Linie und eine Linie, die von Weiß über Grün, Blau und Rot nach Schwarz eingefärbt wird. Mit deiner Formel befinde ich mit zwar jeweils an einer anderen Stelle, aber trotzdem wird auf der Linie interpoliert. Ich würde aber gerne eine Weiße und eine Schwarze Linie erhalten. Wenn ich in GL_POINTS render, dann erhalte ich quasi das gewünschte Ergebnis. Mit GL_NEARST ist der Verlauf nur nicht gefiltert, also die Grenzen zwischen den Farben sind scharf. Aber die Interpolation kriege ich damit irgendwie nicht unterbunden. Oder habe ich da irgendwie nen Denkfehler?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, dann ist das was du willst entweder die Vertices so zu trennen, dass dazwischen keine Verbindung besteht (also Points oder Lines) oder die Textur gleich so zu bauen, dass die Farben in der reihenfolge vorkommen, wie sie verwendet werden (ggf. halt auch mehrfach, aber nicht mehrfach hintereinander).
grüße
_________________ 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
Achso. Statt GL_LINE_STRIP kannst du GL_LINES benutzen. Dann kannst du für jede Linie getrennt die Texturkoordinaten angeben. Nur dann natürlich die Koordinaten exakt auf dem Texel angeben.
Eine andere Möglichkeit währen Farbindices. Hab ich selbst noch nicht benutzt, aber siehe glColorTable und glIndex. Ich glaube diese Möglichkeit ist für dich das ideale da du dir den Umweg über eine Textur ersparst, du musst aber ebenfalls GL_LINES (und nicht *_STRIP) benutzen.
Mitglieder in diesem Forum: Bing [Bot] 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.