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

Aktuelle Zeit: Fr Jul 18, 2025 08:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Texturen dynamisch ändern
BeitragVerfasst: Di Mai 12, 2009 14:26 
Offline
DGL Member

Registriert: Sa Apr 25, 2009 11:17
Beiträge: 9
Ich versuche gerade bei einem Bild in OpenGL zwischen schwarz/weiß und Farb zu wechseln (sprich Sättigung-Zeit als Welle). Wie kann ich das am leichtesten für einzelne Texturen machen?


Zuletzt geändert von stoffl am Mi Mai 13, 2009 12:16, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 12, 2009 23:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Ich denke mal am leichtesten geht es im Fragmentshader. Graustufe bedeutet, dass die
3 Farbkomponenten R, G und B gleich sind.
D.h. du errechnest dir für jedes Pixel einen Durchschnittswert ((R+G+B)/3)) und interpolierst
zwischen dem aktuellen Komponentenwert und dem errechneten Durchschnittswert (wenn
du einen flüssigen Übergang willst - sonst einfach für R, G und B den Durchschnitt setzen).

Gibt wohl noch elegantere Methoden, aber mit dem Durchschnitt zu arbeiten ist vermutlich
am einfachsten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 12, 2009 23:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
dabei muss man aber beachten, dass die intesität von rot, grün und blau unterschiedlich gewichtet werden muss. Ich bin mir nicht sicher in welchem Verhältnis, aber das kann man schnell ergoogeln.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 08:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Luminanz errechnet sich folgendermaßen. Luminanz = Ror * 0.3 + Grün * 0.59 + Blau * 0.11

Wobei ich aber auch denke, dass man mit dem Durchschnitt auch ganz gut fahren wird. Wenn es sich dabei nur um einen kleinen Effekt in einem Spiel oder so handelt. Wenn man aber Fotos in Schwarz/Weiß umwandeln wollte, dann muss es zwangsweise deutlich komplexer werden. Um verschiedene Stimmungen erzeugen zu können ist Luminanz schlicht unbrauchbar.

Zum Anpassen der Farben eignet sich auch ganz gut der HSV-Farbraum. Dabei werden die RGB Werte speziell konvertiert. Und Farbton, Sättigung und Hellwert (Value) liegen dann als seperate Werte vor. Es ist dann auch sehr einfach die Farben zu verschieben oder Sephia Bilder zu erzeugen.

Shader: Jetzt kommt wieder meine Standardfloskel. Wenn Shader dafür keine zu hohe Anforderung darstellen dann spricht da definitiv nichts gegen. Ansonsten kann man so etwas sicher auch mit einfachen Mitteln hintricksen. Hintricksen meine ich wie folgt. Man erstellt beim Laden der Texturen eine zweite Variante die eben nur die Luminanz enthält. Mit der glBitmap sind das nur ein paar Zeilen code. Die untere RGB Textur wird zu 100% dargestellt und die darüber wird entsprechen dem Effekt nach dargestellt. Also gar nicht, leicht transparen oder vollständig sichtbar. So etwas funktioniert natürlich nicht, wenn man in einem Spiel so eine Art Schwarz/Weiß Traumszene ertellen möchte. Dann Bedarf es aber sowieso etwas mehr.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 09:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Um auch mal auf das Topic dieses Threads ("Texturen dynamisch ändern" ) einzugehen:
Stichwort: FrameBufferObjects (FBO)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 13:03 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich hätte noch eine Alternative einzuwerfen :)
Man kann doch auch direkt in den Grafikkartenspeicher schreiben und das dann als Textur verwenden (irgendwie). Hab mich persönlich mangels Zeit damit aber noch nicht beschäftigt. Also etwa so, wie man es mit Turbo Pascal früher gemacht hat... Auf Sulaco gibt's dazu iirc eine Demo, die das sowohl in Turbo Pascal ohne OpenGL macht und dann nochmal mit Object Pascal und OpenGL.

Edit: Ha, gefunden *g* (Siehe Link oben)
Edit 2: Wichtigster Punkt: Das Verfahren ist suuuuuper schnell, mich wundert ein wenig, dass man davon so wenig liest...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 13:31 
Offline
DGL Member

Registriert: Sa Apr 25, 2009 11:17
Beiträge: 9
Danke erst einmal für die zahllreichen Antworten!
Die Idee mit dem Shader ist mir auch schon gekommen, nur will ich die Textur, die zwischen schwarz/weiß und farbig wechselt, auch effizient ändern können (außerdem müsste ich bzw. muss ich so wie so einmal beginnen mit dem Shader zu arbeiten)
Durch Multitexturing würde es auch gut gehen, nur wird es da bei älteren Karten bald einmal kritisch (hab noch ein paar andere Lagen darüber)
Die Geschichte mit dem Texturen neu generieren (bzw. der Link) hat mir recht geholfen. Aber ich denke, dass da die Plasma-Textur zuerst im RAM erstellt wird und dann durch glTexImage2D in den Grafikkartenspeicher geschrieben wird. Aber trotzdem scheint es effizient zu laufen. Mein Problem ist nur, dass das Umwandeln von TBitmap in so einen Array nicht so schnell abläuft. Aber da werde ich wahrscheinlich die Funktion optimieren müssen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Man kann doch auch direkt in den Grafikkartenspeicher schreiben und das dann als Textur verwenden (irgendwie).

Das sind die besagten FramebufferObjects. Vom Prinzip rendert man ganz normal ein Bild, nur das dieses dann nicht auf dem Bildschirm sondern in einer Textur landet.

Wer es noch schneller will sollte sich mit Transform-Feedback und TextureBufferObjects beschäftigen, was aber Shader Model 4.0 benötigt. Ich rate aber jedem die Finger davon zu lassen bevor er nicht Shader (!!) und FramebufferObjects verstanden hat.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Frase hat geschrieben:
Ich hätte noch eine Alternative einzuwerfen :)
Man kann doch auch direkt in den Grafikkartenspeicher schreiben und das dann als Textur verwenden (irgendwie). [...]
Edit 2: Wichtigster Punkt: Das Verfahren ist suuuuuper schnell, mich wundert ein wenig, dass man davon so wenig liest...

Scheinbar scheint es leider nur das primitivste Verfahren zu sein: Selbst Speicher anlegen (64x64x3 Byte) und dann in jedem Step die Daten neu an die Textur schicken:

Code:
  1. procedure UpdatePlasma;
  2.   //Plasma berechnen
  3.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, Plasma);
  4. end;
  5.  


Schade eigentlich. Aber für son Plasma reicht 64x64 echt auch, Verwaschen ist hier ja cool. Muss das mal verwenden. ^^ Aber langsam beginnt ihr mich für Shader zu interessieren - muss mal schauen, was meine Hardware eigentlich kann ^^

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 21:28 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Coolcat hat geschrieben:
Zitat:
Man kann doch auch direkt in den Grafikkartenspeicher schreiben und das dann als Textur verwenden (irgendwie).

Das sind die besagten FramebufferObjects. Vom Prinzip rendert man ganz normal ein Bild, nur das dieses dann nicht auf dem Bildschirm sondern in einer Textur landet.

Nein, du hast mich falsch verstanden. Am Beispiel, was ich verlinkt hab sieht man es doch. Da werden doch keine FBOs verwendet...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 22:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Achso war das gemeint...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 17, 2009 11:33 
Offline
DGL Member

Registriert: Sa Apr 25, 2009 11:17
Beiträge: 9
Danke für die Hilfe, ich habe mein Ziel jetzt zum Teil erreicht. Nun werde ich mich vor allem aufs Debuggen und vor allem effizienter Verarbeiten konzentrieren.
Unter http://filesystem.hausaufgaben.bplaced.net/test.zip (~800KB) habe ich für Interessierte die jetzige EXE-Datei.

(Ich weiß, dass es mit den Texturen beim Laden noch sehr schlecht umgeht.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 17, 2009 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hm, bei mir ist das Fenster einfach nur schwarz. (Linux mit Wine)

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 17, 2009 17:28 
Offline
DGL Member

Registriert: Sa Apr 25, 2009 11:17
Beiträge: 9
Probier mal links/rechts Taste ein paar mal.

Eigentlich müsste es gehen. Die Bilddatei nehme ich an wird sich im gleichen Ordner befinden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 17, 2009 18:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hier passiert garnichts. Alle beiden Dateien sind in "/tmp". Brauch ich noch irgendeine Bibliothek? Aber dann hätte er ja ne Fehlermeldung angezeigt... *wunder*

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]