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

Aktuelle Zeit: Sa Jul 05, 2025 17:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: RenderToTexture + Alpha-Kanal
BeitragVerfasst: Do Jan 31, 2008 20:45 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Nächstes Problem:

Ich render eine Figur in eine Texture, und versuche nachher den Hintergrund per Blending auszublenden.

Ich erzeuge die Texture mit genügend Speicherplatz (x*y*4) für RGBA:

Code:
  1.  GetMem(pTexData, x*y*4);
  2.   glGenTextures(1, @Screen);
  3.   glBindTexture(GL_TEXTURE_2D, Screen);
  4.   glTexImage2D(GL_TEXTURE_2D, 0, 4, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData);
  5.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);




Ich lösche zunächst:
glClear(GL_DEPTH_BUFFER_BIT);

Dann setzt ich die Hintergrundfarbe:
glClearColor(0,0,0,0);


Ich render dann ganz normal in die Texture:

Code:
  1. lBindTexture(GL_TEXTURE_2D, Screen);
  2. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, x, y, 0);


Und nachher das Blending:
Code:
  1.  glEnable(GL_BLEND);
  2.  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


Aber es klappt nicht. Das RenderToTexture klappt super, nur der Hintergrund ist und bleibt drinnen, da kann ich einstellen was ich mag.
Am Blending kanns auch nicht liegen, weil für z.b. tga's die bereits einen Alpha-Kanal haben klappts gut.

Ergo muss der Fehler schon vorher drin sein. Offenbar wird kein Alpha-Kanal erzeugt, was ich aber net verstehe. Sollte so klappen. Ich habe gegooglet und 1, 2 Themen dazu gefunden. Die verwenden das selbe Prinzip.

Ich sehe den Fehler einfach net.. Weiß jemand worans liegt?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 31, 2008 22:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das RenderToTexture kopiert den aktuellen Framebuffer in eine Textur. Aus diesem Grund muss dein Framebuffer bereits einen Alphakanal besitzen. Ansonsten gibts keinen. NVidia (oder wars gerade ATI?) geht glaube ich her und lässt den Alphakanal weg, wenn er nicht explizit angegeben wurde. In der Methode CreateRenderingContext in der dglOpenGL.pas müsstest du bei dem PixelFormat den cAlphaBits befüllen. Also eine 8.

Code:
  1.     cColorBits := ColorBits;  // Gibts schon
  2.     cAlphaBits := 8;


Wobei es aber auf älterer Hardware auch gut sein kann, dass der Alphakanal gar nicht erstellt wird. Bzw bei 16 Bit Farbtiefen kann das auch passieren. Deswegen ist das mit dem Alpha im Framebuffer vorraussetzen mit vorliebe zu genießen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 01, 2008 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Lossy eX hat geschrieben:
Deswegen ist das mit dem Alpha im Framebuffer vorraussetzen mit vorliebe zu genießen.

Mit Vorsicht zu genießen meinst du wohl :wink:

Wie sähe das aus, wenn man die Framebuffer-Erweiterung benutzen würde? Wäre die ebenfalls abhängig von 16-Bit-Bildschirmen?

Gruß Lord Horazont

_________________
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:
BeitragVerfasst: Fr Feb 01, 2008 11:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja natürlich meine ich Vorsicht. :roll: Oder auch genau so für diejenigen die die Gefahr lieben. *hust* ;)

ScreenBuffer: FrameBufferObjects dürften keine Probleme machen, da das ja eigentlich vollständig im Speicher existieren. Bei PixelBuffer könnte es wieder anders aussehen, da diese eigentlich einen Speicherkontext darstellen. Also auch wieder mit einem Pixelformat auf einem DC. Und dann liegt es wieder in der Hand des Treibers.

Wobei ATI auf meiner alten Karte bei 16 Bit aber glaube ich sogar noch einen zusätzlichen 8 Bit Alpha dazu gepackt hat. Also insgesamt dann trotzdem 24 Bit. Aber 16 Sichtbare. Ist halt alles immer ermessenssache des Treibers was da letzten Endes passiert.

Überprüfen kann man das wenn man sich den Descriptor von dem ausgewählten Pixelformat anschaut. Dort steht es dann recht genau drinne. Dazu muss man aber leider selber den Kontext erstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 01, 2008 14:41 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
okay, danke für die Infos.

Ich habe jetzt den Alpha-Kanal erzwungen.


Zitat:
Wobei es aber auf älterer Hardware auch gut sein kann, dass der Alphakanal gar nicht erstellt wird. Bzw bei 16 Bit Farbtiefen kann das auch passieren. Deswegen ist das mit dem Alpha im Framebuffer vorraussetzen mit vorliebe zu genießen.


Nun ja, ich gehe jetzt einfach mal davon aus, dass heutzutage kaum noch jemand 16 Bit als Farbtiefe nutzt, oder wenn dann is das ein sehr geringe Prozentsatz.
Aber es kann ja nicht schaden eine Überprüfung einzubauen und dementsprechend anderes zu reagieren. Denke das bekomm ich hin.

Danke nochma, ich hatte mir schon nen Wolf gesucht weil ich den Fehler net gefunden habe, jetzt läufts rund

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


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


Wer ist online?

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