Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 19:17

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 09:03 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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:
  1.  
  2. glShadeModel(GL_FLAT);
  3. glBegin(GL_LINE_STRIP);
  4. for I := 1 to Count - 1 do begin
  5.   glColor3ub(...,...,...);
  6.   glVertex3fv(...,...,...);
  7. end;
  8. 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:
  1.  
  2. glEnable(GL_TEXTURE_1D);
  3. glBindTexture(GL_TEXTURE_1D, TexID);
  4. glColor3ub(255,255,255);
  5. glBegin(GL_LINE_STRIP);
  6. for I := 1 to Count - 1 do begin
  7.   glTexCoord1f(...);
  8.   glVertex3fv(...,...,...);
  9. end;
  10. 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 15:49 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Du könntest die Farbwerte in ein Array laden und dann in der Schleife aufrufen.

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 16:09 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. glShadeModel(GL_FLAT);
  3. glBegin(GL_LINE_STRIP);
  4. for I := 1 to Count - 1 do begin
  5.   glColor3ub(...,...,...);
  6.   glVertex3fv(...,...,...);
  7. end;
  8. 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:
  1.  
  2. glEnable(GL_TEXTURE_1D);
  3. glBindTexture(GL_TEXTURE_1D, TexID);
  4. glColor3ub(255,255,255);
  5. glBegin(GL_LINE_STRIP);
  6. for I := 1 to Count - 1 do begin
  7.   glTexCoord1f(...);
  8.   glVertex3fv(...,...,...);
  9. end;
  10. 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
Code:
  1.  
  2. for(l = 0;l<count;l++)
  3. {
  4.     glTexCoord1f( ((float)(abs(l) % texWidth)) /texWidth);
  5.    ....
  6. }
  7.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 18:40 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Hallo,

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.

Grüße,
John


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 20:38 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Mi Mai 30, 2012 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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:
  1. (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
Code:
  1. texel / textureSize

heraus. ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Fr Jun 01, 2012 16:13 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
@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.

Grüße,
John


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Fr Jun 01, 2012 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
@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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Fr Jun 01, 2012 17:38 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
@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:
  1. glBegin(GL_LINE_STRIP);
  2. for I := 0 to Count - 1 do begin
  3.   glTexCoord1f(Item[I].Value/10);
  4.   glVertex3fv(@Item[I].Vertex[0]);
  5. end;
  6. 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?

Grüße,
John


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Fr Jun 01, 2012 19:16 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texture flat shading
BeitragVerfasst: Sa Jun 02, 2012 12:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 5 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]