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

Aktuelle Zeit: Fr Jul 18, 2025 12:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Farbkanal als Alphakanal verwenden?
BeitragVerfasst: Di Nov 18, 2008 21:12 
Offline
DGL Member

Registriert: Mo Okt 22, 2007 09:00
Beiträge: 22
Wohnort: Ilmenau
Hi alle zusammen,

ich rede nicht um den heißen Brei herum, sondern Fall direkt mit der Tür ins Haus:

Ist es möglich, eine Textur so zeichnen zu lassen, dass sie als Alphakanal einen Farbkanal einer anderen Textur erhält?

Gut, vielleicht doch ein paar mehr Worte dazu ^^

Meine Situation:
Ich verwende Alpha-transparente, teilweise komplexere Formen, um gewisse Menü-Elemente oder zB eine Nachrichten-Box darzuustellen.
Momentan verwende ich dafür eine komplett weiße Textur (die Farbe lässt sich ja während der Laufzeit mit glColor* manipulieren), die einen entsprechenden Alphakanal besitzt, um die Form zu erhalten. Beim Zeichnen kommt also die alphatransparente, weiße Form heraus. Soweit so gut ^^

Da ich verschiedene solcher Flächen habe, benötige ich natürlich für jede einzelne von ihnen eine eigene Textur: Wieder komplett weiß, aber mit einer anderen Form im Alphakanal.

Meine Idee:
Der einzige Kanal, der also letztendlich verwendet wird, ist der Alphakanal. Da stellt sich freilich die Frage, ob man nicht irgendwie 4 dieser Alphakanäle in eine Textur stecken kann, und für 3 Formen die 3 (verbleibenden) Farbkanäle verwendet. Also letztendlich eine 4er-Textur, die jeweils in R, G, B und A eine von den angedeuteten Formen enthält.

Das Problem, wie bereits erwähnt:
Ist es möglich, irgendwie ein weißes Quad zu zeichnen, und dafür als Alphamaske einen Farbkanal aus einer anderen Textur zu verwenden?
Sagen wir, der Grüne Kanal enthält ein abgerundetes Viereck für eine Nachrichten-Box. Ist es möglich, diesen Grünen Farbkanal zu verwenden, um eine weiße Nachrichten-Box zu zeichnen? (Nochmal um es deutlich zu machen: Es ist wichtig, dass der gesamte Kanal verwendet wird, eine 1bit Transparenz reicht mir nicht ^^)
Oder lohnt sich der Aufwand am Ende nicht und ich sollte bei meinen weißen Texturen bleiben?

Sonstige, eventuell relevante Daten:
* Texturformat: .tga
* Texturloader: glBitmap.pas (das Ding von LossyX ^^)
* Entwicklungsumgebung: Turbo Delphi
* Programm für: Windows (32bit)


Würde mich freuen, wenn jemand was dazu sagen könnte, inwiefern das realisierbar wäre.


MfG ... (* Wie heiß ich hier nochmal? achja xD *) Zwoetzen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 09:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich muss gestehen, dass ich den Sinn dahinter nicht ganz verstanden habe. Allerdings kannst du auch problemlos Textur erstellen die lediglich aus einem Alphakanal bestehen. TGAs können auch direkt eine solche Graustufentextur aufnehmen. Beim Erstellen musst du nur darauf achten, dass du nach dem Laden (und vor dem Generieren) das InternalFormat auf ifAlpha umstellst, da sonst ifLuminace benutzt wird. Luminanz entspricht in OpenGL aber einem grauem RGB Kanal. Mit 4 solcher Alphatexturen hättest du nur die Daten der Masken und keine Unnötig leeren RGB Kanäle. Allerdings 4 unterschiedliche Texturen.

Wie man den roten Kanal als Alpha benutzten kann weiß ich nicht. Zu mindest in der festen Functionspipline. Evtl gibts es ja eine Möglichkeit aber die dürfte dann vermutlich ziemlich fummelig werden. Da wäre es vermutlich besser gleich auf Shader zu setzen. Damit kannst du direkt in die Pipeline eingreifen und die Werte so verdrehen wie du das haben willst. Das erspart vermutlich sehr sehr viel Frust und Sucherei.

"Alternativ" gibts aber auch noch Geforce 8 Texture Arrays oder 3D Texturen. Bei 3D Texturen könntest du zum Beispiel 4 AlphaMasken übereinander legen. Beim Zeichnen müsstest du dann noch eine dritte Texturkoordinate mit angeben die dann die Ebene auswählt. Allerdings weiß ich nicht wie 3D Texturen heute unterstützt werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 17:52 
Offline
DGL Member

Registriert: Mo Okt 22, 2007 09:00
Beiträge: 22
Wohnort: Ilmenau
Danke für die Antwort :)

Lossy eX hat geschrieben:
Also ich muss gestehen, dass ich den Sinn dahinter nicht ganz verstanden habe.

Naja, der Sinn ist letztendlich nur, dass ich die 3 Kanäle nicht einfach ohne Verwendung rumstehen lasse, da dies ja 75% Verschwendung wäre. Deshalb habe ich mir Gedanken darüber gemacht, wie ich diese zusätzlich verwenden könnte ;)

Lossy eX hat geschrieben:
Wie man den roten Kanal als Alpha benutzten kann weiß ich nicht. Zu mindest in der festen Functionspipline. Evtl gibts es ja eine Möglichkeit aber die dürfte dann vermutlich ziemlich fummelig werden.

Rumfummeln muss dann doch nicht sein, dann notfalls bei der momentanen Lösung mit 3 nicht verwendeten Kanälen bleiben ^^

Lossy eX hat geschrieben:
Da wäre es vermutlich besser gleich auf Shader zu setzen. Damit kannst du direkt in die Pipeline eingreifen und die Werte so verdrehen wie du das haben willst. Das erspart vermutlich sehr sehr viel Frust und Sucherei.

"Alternativ" gibts aber auch noch Geforce 8 Texture Arrays oder 3D Texturen. Bei 3D Texturen könntest du zum Beispiel 4 AlphaMasken übereinander legen. Beim Zeichnen müsstest du dann noch eine dritte Texturkoordinate mit angeben die dann die Ebene auswählt. Allerdings weiß ich nicht wie 3D Texturen heute unterstützt werden.

Hmm, mit Shadern hab ich noch überhaupt nicht gearbeitet. Vielleicht werf ich da mal einen Blick rein ^^
Unter 3D-Texturen kann ich mir zwar bildlich jetzt etwas vorstellen, nur wird wahrscheinlich der Aufwand etwas zu groß sein für "die paar" Texturen ^^

Lossy eX hat geschrieben:
Allerdings kannst du auch problemlos Textur erstellen die lediglich aus einem Alphakanal bestehen. TGAs können auch direkt eine solche Graustufentextur aufnehmen. Beim Erstellen musst du nur darauf achten, dass du nach dem Laden (und vor dem Generieren) das InternalFormat auf ifAlpha umstellst, da sonst ifLuminace benutzt wird. Luminanz entspricht in OpenGL aber einem grauem RGB Kanal. Mit 4 solcher Alphatexturen hättest du nur die Daten der Masken und keine Unnötig leeren RGB Kanäle. Allerdings 4 unterschiedliche Texturen.

Habe ich das jetzt richtig verstanden: Ich erstelle einfach eine graue Textur (also Graustufen, 8bit), und kann diese Textur dann als Alphakanal verwenden?
Das wäre letztendlich genau das, was ich erzielen möchte: Jeder Kanal pro Textur wird verwendet (hier eben 1 Kanal, da mehr ja nicht da ist ^^). Somit würde ich nicht unnötig was verschwenden.
Mir scheint als wäre dies die optimalste Lösung, ich werde es direkt versuchen, umzusetzen. Danke für den Tipp :)
(Wieso bin ich nicht selbst darauf gekommen, erstmal zu versuchen, die Kanäle zu reduzieren anstatt alle vollmalen zu wollen... xD)

MfG Zwoetzen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
zwoetzen hat geschrieben:
Habe ich das jetzt richtig verstanden: Ich erstelle einfach eine graue Textur (also Graustufen, 8bit), und kann diese Textur dann als Alphakanal verwenden?
Das wäre letztendlich genau das, was ich erzielen möchte: Jeder Kanal pro Textur wird verwendet (hier eben 1 Kanal, da mehr ja nicht da ist ^^). Somit würde ich nicht unnötig was verschwenden.
Mir scheint als wäre dies die optimalste Lösung, ich werde es direkt versuchen, umzusetzen. Danke für den Tipp :)
(Wieso bin ich nicht selbst darauf gekommen, erstmal zu versuchen, die Kanäle zu reduzieren anstatt alle vollmalen zu wollen... xD)

Ja genau so meinte ich das. ;) Mit Multitexturing kannst du diese Textur auch ganz normal unter eine RGB Textur "mischen". Damit könntest du die Transparenz bewegen wärend die Farbe stehen bleibt etc.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 19:22 
Offline
DGL Member

Registriert: Mo Okt 22, 2007 09:00
Beiträge: 22
Wohnort: Ilmenau
Habe irgendwie noch so meine Probleme, die Textur ordentlich als Grayscale zu speichern. An den Einstellungen sollte alles richtig sein (Bild ist in Graustufen, gespeichert wird als 8bit), in Delphi bekomm ich aber nur die Meldung "LoadFromStream - Couldn't load Stream. It's possible to be an unknow Streamtype." (Fehler tritt in TglBitmap.LoadFromStream() auf)
Kann es sein, dass mein PaintShopPro wieder zu doof ist, das Format gescheit abzuspeichern? (Hatten wir ja schonmal ^^)

Folgenden Code verwende ich zum Anlegen des Objektes (Sollte soweit eigentlich richtig sein):
Code:
  1.   var FTest: TglBitmap2D;
  2. [...]
  3.   FTest := TglBitmap2D.Create;
  4.   FTest.LoadFromFile('D:\Panel2.tga');
  5.   FTest.InternalFormat := ifAlpha;
  6.   FTest.GenTexture();


Im Anhang sowohl die Textur selbst, als auch wie sie aussehen sollte (Screenshot aus PSP).
Habe mir vorhins auch extra nochmal die neueste Version der glBitmap.pas runtergeladen (meine war doch schon etwas älter), hat den Fehler aber nicht behoben.

(Vielleicht sollte ich mich doch mal nach einer alternativen Bildbearbeitungsprogramm umsehen... Wollte eigentlich schon seit längerem mal meine Nase in Gimp stecken ^^)

EDIT: Hmmm, das tga-Attachment kann man irgendwie nicht downloaden...
EDIT2: So, schnell mal gezippt, jetzt gibts einen DL-Link ^^


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
das problem ist du hast nur ein indiziertes bild, aber kein graustfuen bild, sagt jedenfalls gimp.
im anhang die datei sollte graustufen sein, ohne kompression, ohne ursprung unten links. ^^
edit: auch gezipt xD


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 20:36 
Offline
DGL Member

Registriert: Mo Okt 22, 2007 09:00
Beiträge: 22
Wohnort: Ilmenau
Dazu sag ich einfach mal: -.-"

Habe die Datei natürlich direkt getestet, und funktioniert natürlich auch, wie sollte es anders sein. Ich sag mal, das wars für PaintShopProX (das einzige Programm, was ich aus dem Software-Paket vom Notebook noch verwende...), ab jetzt wird zurück ge-Gimp-t :D
Lag ich mit meiner Vermutung ja richtig, dass da beim Speichern was schiefgeht ^^

Danke für deine Antwort ;)

EDIT:
Mal als kleiner Vergleich (hatte sowieso grad bissl rumprobiert, und habe dann einfach alle Möglichkeiten durchgenommen ^^):
Auflösung: jeweils 1024x128 (die Textur von oben)

PSPX, RGBA, unkomprimiert: 514 KB
PSPX, RGBA, komprimiert: 513 KB (immerhin 1 KB gespart xD)
PSPX, Grau, unkomprimiert: 130 KB (funktioniert nur leider nicht, da keine Graustufen, sondern indizierte Palette (oder sowas))
PSPX, Grau, komprimiert: 7 KB (funktioniert ebenfalls nicht, auch wenn die Komprimierung hier besser zu arbeiten scheint)

Gimp, RGBA, unkomprimiert: 513 KB
Gimp, RGBA, komprimiert: 15 KB (das haut schon mehr rein ^^)
Gimp, Grau, komprimiert: 129 KB
Gimp, Grau, komprimiert: 5 KB

Wenn man bedenkt, dass ich vorher die 513 KB-Version hatte, und nun das gleiche für 5 KB, ist das doch ein gewaltiger Unterschied. Wobei selbst die 15 KB (also wieder die RGB-Kanäle nicht verwendet) schon deutlich besser sind, allein weil es mit Gimp gespeichert ist :shock:
Was erkennen wir daraus: PSPX kann entweder nicht effektiv komprimieren, oder speichert die Textur gleich falsch ab xD (bzw. unlesbar für die glBitmap.pas)
Gut, eventuell sollte man dazusagen, dass PSPX schon einige Zeit auf dem Buckel hat, und eventuell somit nicht die neuesten Techniken drauf hat, kA inwiefern sich da was in den letzten Jahren geändert hat (Zwecks Komprimierung).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 19, 2008 23:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Also solche pakete die bei laptops oder Pcs dabei sind, sehen zwar immer ganz nett aus, aber meistens sind die nur da um kunden zu ködern. ich hab bisher noch keins dieser programme gesehen, welche es nicht auch von anderen anbietern gratis gegeben hätte und meistens noch stabiler ^^
und dem programm kann zur last gelegt werden, dass die komprimationstechnik vermutlich älter ist, als die programmiersprache in der sie geschrieben wurden. naja das war jetzt nur spaß ^^
gimp ist vll recht nett, aber hier gabs auch schon viele pro contra disskussionen. aber für zwischendrin ist es sicher geeignet, vor allem wenn man korrektere ergebnisse haben möchte.

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also warum es dort solche Unterschiede in der "Kompression" gibt ist mir ein bisschen ein Rätsel. Denn bei der Kompression werden nur aufeinanderfolgende gleiche Pixel zusammengefasst. Also Anstelle von "Weiß, Weiß, Weiß, Weiß, Weiß, Weiß" steht halt "6x Weiß" da. Ich denke, dass PSP dort einfach keine Kompression angewendet hat. Auch wenn er es vielleicht gesagt hat. Je nach Bild kann es mit einer solchen "Kompression" auch ins Negative umschlagen.

Ja PSP. Macht so ein paar Sachen anders. Das hatten wir in der tat schon mal. ;) Allerdings hat die glBitmap keinen Anspruch auf absolute Vollständigkeit. Bei TGAs unterstütze ich zum Beispiel keine Farbpalette, weil TGAs Graustufen direkt können. Und Paletten für Texturen eh nicht sonderlich zu gebrauchen sind. Graustufen über eine Palette zu lösen ist aus Sicht des Anwenders allerdings vollkommen okay. Die enthaltenen Bilddaten werden dadurch ja nicht verändert. Sie nutzen lediglich einen anderen Weg. Bei BMPs simuliert GIMP im übrigen Graustufen auch über eine Palette. Das wird beim Laden dann auch wieder richtig erkannt. Diese BMPs kann man mit der glBitmap laden. Allerdings ignoriere ich dort stumpf die Palette. Birgt aber das Risiko, falls jemand doch mal ein Palettenbild öffnet, dass es nicht so aussieht wie es gewünscht ist.

PS: Ja die Pro und Contra GIMP Diskussion ist noch gar nicht so lange her. Das sollte wenn dann auch dort weitergeführt werden. ;) Allerdings sollte man bei allen Programmen bedenken, dass jeder andere Vorstellungen und Erwartungen an ein Programm setzt. Ganz zu schweigen von unterschiedlichen Einsatzgebieten. Und wenn es für einen persönlich ausreicht was spricht dann noch dagegen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.008s | 14 Queries | GZIP : On ]