Einige OpenGL Listen Erstellt. Diese "Punktwolken" kann ich mittels
Code:
glCallLists(..)
auf meinen Screen ausgeben. Das Funktioniert auch alles Wunderbar. Mache ich vor dem Aufruf der Liste ein glColor3f(..) dann färbt sich die Punktwolke auch entsprechend ein, wie sie das soll.
Mein Problem ist nun folgendes. Ich will die Opazität ( den Grad der Transparenz ) beim Erzeugen der Liste für jeden Aufruf von glVertex2i getrennt angeben ( was man normalerweise mit glcolor4f vor dem Aufruf von glVertex2i machen würde ), die Farbe aller Pixel, will ich nach wie vor über glcolor3f vor dem Aufruf der Liste angeben.
Geht das ?, und wenn ja wie ?
Wären es anstatt glVertex2i der Aufruf eines Bildes würde es gehen, da hier der Wert von glColor3f ja mit den Farbwerten der Graphik multipliziert wird. Doch leider habe ich nur die "Pixel" und die sollten es auch bleiben ...
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Also wenn du glColor* mehrmals nacheinander aufrufst, zählt immer nur das letzte Ergebnis, alles davor wird überschrieben. Daran kannst du mit ziemlich hoher Sicherheit nichts ändern. Was du aber machen kannst (und es gibt bestimmt noch mehr Möglichkeiten):
- Benutze Shader + VBO (und eventuell ein eigenes Vertexformat) - Texturiere deine Punkte. Wenn du eine weiße Textur mit Alphakanal nimmst, kann jeder Punkt einen anderen Alphawert haben und die Farbe kannst du mit glColor* multiplizieren - Setze die Transparenz der Vertices beim Erstellen der Displaylist via glColor4f und die Farbkomponenten auf weiß. Rufe beim Rendern zunächst glCallList auf ein zeichne danach ein Fullscreenquad mit der entsprechenden Farbe und entsprechenden glBlendFunc-Einstellungen über den ganzen Bildschirm. Das funktioniert nur, wenn du vorher noch nichts anderes als deine GL_POINTS-Cloud gezeichnet hast.
Am einfachsten ist wahrscheinlich die zweite Möglichkeit.
Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
An die Texturierung der Punkte hatte ich auch schon gedacht ( gerade wegen GLmaterial Color ), wie man das Umsetzt da hörts dann schon auf mit meinen OpenGL Kenntnissen.
Eine "Temporäre" Lösung die sehr gut funktioniert habe ich mittlerweile.
Ich habe mir quasi die glcalllist in Software nachgebaut und entdprechende Farbmanipulationen ermöglicht-> Nachteil jeder Callist aufruf findet natürlich durch die CPU statt und nicht in der Grake = Geschwindigkeitsverlust ( wenn Interesse besteht, lad ich das alles mal auf meinen Webserver )
Das Nutzen von Shadern wäre ansich auch ne feine Sache, nur leider gabs die noch nicht als ich Studiert habe, und im autodidaktischen Einlesen bin ich an dem Thema nun schon mehrfach gescheitert
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Das Texturieren von Oberflächen gehört zu den absoluten Grundlagen und deshalb haben wir dazu natürlich auch ein Tutorial (was natürlich nicht heißen soll, dass es hier keine Tutorials zu fortgeschrittenen Themen gibt ). Wenn du das schon durchgearbeitet hast und trotzdem nicht weiterkommst, erklär einfach mal, woran genau es hakt.
Das Nutzen von Shadern wäre ansich auch ne feine Sache, nur leider gabs die noch nicht als ich Studiert habe, und im autodidaktischen Einlesen bin ich an dem Thema nun schon mehrfach gescheitert
Zum eigentlichen Problem: Verstehe ich das richtig, die Farbe ändert sich jedes Frame, der Alpha-Kanal bleibt gleich?
Die professionelle Lösung wäre natürlich (wie schon von mrtrain geschrieben) ein VBO mit Shader. Pro Vertex speicherst du nur den Alpha-Kanal. Die Farbe kommt dann global via Uniform-Variable. Im Vertexshader baust du beides zur richtigen RGBA-Farbe zusammen.
Die Lösung via Textur wird dann sinnvoll, wenn du wirklich viele viele Punkte hast und sich die Alpha-Werte jedes Frame ändern. Wenn es nur ein paar hundert Punkte sind schreib einfach den VBO jedes Frame neu.
Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
*g*, ich habe keine Quads sondern nur "Punkte".
Im Prinzip hatte ich versucht Plattformunabhängig eine TrueType Font in OpenGL zu realisieren, das Ganze wird dann in Balanced umgesetzt. Seit ich vor knapp 2 Jahren auf Linux Umgestiegen bin, kann ich das Spiel nicht mehr Kompilieren. Also habe ich begonnen es nach Linux / Lazarus zu portieren.
Zu Anfangs habe ich eine reine Bitmap Font verwendet, aber das sieht einfach nur Sch**** aus. Nachdem ich nun aber bis auf den Netzwerkmodus eigentlich alles portiert hatte, muste ich nun an die True Type font.
Meine jetzige Lösung ist unter OpenGL True Type Font verfügbar und funktioniert nun 1a ( siehe Screenshot ).
Das Kernstück Code ist natürlich mein CallList ersatz :
Da der User die Schriftfarbe natürlich beeinflussen können soll ( im Screenshot sieht man es in Rot FPS und Gelb der Text unten mitte) müssen x,y,z von glcolor4f variabel gemacht werden. Die Alpha Werte werden für die Kantenglättung benötigt.
Da sich die Punkte und auch ihre Transparenz nicht ändern drängt sich eben der Gedanke auf, das ganze bereits im Vorraus in die Grake zu laden. In meiner Simple Font hatte ich dieses Prinzip Erfolgreich umgesetzt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: Google [Bot] und 9 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.