JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=dd8794af5c98b81f4b838e3a5a7003f3Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

BackBuffer-Transparenz im Fenstermodus?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Skabus
Mini JLI'ler



Anmeldedatum: 14.07.2006
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 06.10.2008, 04:44    Titel: BackBuffer-Transparenz im Fenstermodus? Antworten mit Zitat

Hi!

Für mein aktuelles Projekt möchte ich den BackBuffer im Fenstermodus vollständig transparent machen.Scheinbar funktioniert das allerdings
mit dem D3DCOLOR_ARGB-Makro nicht....

Ich möchte mit WinAPI und DirectX ein sog. Screenmate erstellen.Dafür müsste der Backbuffer komplett durchsichtig sein, damit nur die Grafik meiner Figur selber angezeigt wird....

Mit dem WinAPI habe ich bereits das Fenster komplett transparent machen können.Nur bei DirectX streikt er.

Hat jemand ne Idee wie ich das bewerkstelligen könnte?

Ich wäre für jegliche Hilfe sehr dankbar!


MFG Ska
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 10.10.2008, 07:53    Titel: Antworten mit Zitat

Das geht so leider nicht mit dem BackBuffer, aber das was du machen möchtest schon.

Erstelle dein Fenster als LayeredWindow ich glaube dazu muss der ExStyle des Fenster WS_EX_LAYERED gesetzt sein. Danach musst du nicht direkt in einen backBuffer rendern sondern in eine RenderTarget Textur. Diese textur kann nun einen AlphaKanal besitzen (sollte er auch.)

Diese Textur kannst du nun in ein HBITMAP wandeln (Dein RenderTarget locken und dann in das HBITMAP kopieren). Dabei sollte beachtet werden, dass das HBITMAP etwas anders aussieht als deine Textur was bedeutet das du jeden Pixel des RenderTargets erst in das richtige Format bringen musst, das geht entweder indem du ixelweise kopierst und zuvor jeden Pixel transformierst oder einen Shader verwendest der beim Rendern dies automatisch vornimmt. (a) jeden Pixel nachträglich ändern, b) beim rendern schon jeden Pixel transformieren oder c) per Postprocessing und einem Filter diesen das transformieren erledigen lassen).

Das Transformieren der PixelFarben geht am besten so:

Zitat:
Farbe.RGB = Farbe.RGB * Farbe.A


Wenn die HBITMAP gefüllt ist kannst du die Bitmap als Layer für dein fenster benutzen damit dieses dann Transparent wird, dazu musst du das hier verwenden:

CPP:
BLENDFUNCTION BlendFunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
POINT SourcePoint = {0, 0};

::SelectObject(SourceBitmapDevicContext, TheBitmap);

::UpdateLayeredWindow(WindowHandle, DesktopDeviceContext, &TopLeftWindowPosition, &WindowSize, SourceBitmapDevicContext, &SourcePoint, 0, &BlendFunction, ULW_ALPHA);


Hier noch ein Weg um das Bitmap zu erstellen welches du verwenden kannst:

CPP:
DesktopDeviceContext = ::GetDC(NULL);
SourceBitmapDevicContext = ::CreateCompatibleDC(DesktopDeviceContext);

BITMAPV5HEADER Header;
::ZeroMemory(&Header, sizeof(BITMAPV5HEADER));
Header.bV5Size = sizeof(BITMAPV5HEADER);
Header.bV5Width = TextureSizeWidth;
Header.bV5Height = -TextureSizeHeight;
Header.bV5Planes = 1;
Header.bV5BitCount = 32;
Header.bV5Compression = BI_BITFIELDS;
Header.bV5RedMask   =  0x00FF0000;
Header.bV5GreenMask =  0x0000FF00;
Header.bV5BlueMask  =  0x000000FF;
Header.bV5AlphaMask =  0xFF000000;

// create a DIB, we want to put our render texture data into this DIB (with something more)
TheBitmap = ::CreateDIBSection(SourceBitmapDevicContext, (BITMAPINFO*)&Header, DIB_RGB_COLORS, (void**)&BitmapBits, NULL, 0x0);


Du musst folgende Dinge natürlich dann irgendwann mal freigeben:

CPP:
::DeleteObject(TheBitmap);
::DeleteDC(SourceBitmapDevicContext);
::ReleaseDC(NULL, DesktopDeviceContext);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum