|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Skabus Mini JLI'ler
Anmeldedatum: 14.07.2006 Beiträge: 3
Medaillen: Keine
|
Verfasst am: 06.10.2008, 04:44 Titel: BackBuffer-Transparenz im Fenstermodus? |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 10.10.2008, 07:53 Titel: |
|
|
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 |
|
|
|
|
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
|