Transparenz von PNG Bild in DirectX

Hallo

Ich programmiere im Moment ein Karte mit einem dazugehörigen Mapeditor.
Für die Übergänge der veschiedenen Texturen möchte ich PNG-Bilder mit einem Verlauf zu Transparenz verwenden.

Leider werden die Bilder nicht richtig transparent dargestellt.
Sie sind immer in der Mitte halbiert, oben weiss und unten die Textur.

So werden meine Surfaces erstellt:


Code:
m_lpD3DDevice->CreateOffscreenPlainSurface(128,128, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &VecPatternSurface[i], 0);

Und so wird das Bild reingeladen:

Code:
D3DXLoadSurfaceFromFile(VecPatternSurface[n], 0,0,Buffer,0,D3DX_DEFAULT,0,0);
Hat jemand eine Idee, wie ich diesen Fehler beheben könnte?

Vielen Dank für alle Antworten!
 
Zuletzt bearbeitet:
Ich nehme mal an, auf die richtige Größe hast du geachtet?

Weil Du die Bilder auf 128x128 lädst...

:confused:
sonst hab ich auch keine Ahnung...
Sorry
 
Ja, hab ich.
Trotzdem danke für deine Antwort.

Ich könnte ja auch direkt auf das Surface zugreifen und für jedes einzelne Pixel den Alphawert setzen...
Weiss jemand, wie ich nur den Alphawert einer Farbe verändern könnte, ohne die ganze Farbe neu zu schreiben?

Also z.B. aus %100 sichtbarem Rot (0x00ff0000) transparentes Rot zu machen (0xffff0000)

hoffentlich hab ich es jetzt nicht gerader verdreht...

Bin halt noch nicht so erfahren.
 
Wie befürchtet hast du's verdreht :) Macht aber nix.

Um aus sichtbarem Rot (0xffff0000) zu machen, ver-oder-st du den Farbwert mit dem vollen Alpha:

DWORD dwPixel = 0xff0000;

dwPixel |= 0xff000000;

Dann sind die oberen 8 bit voll gesetzt.

Achtung: Das passt aber nur für eine Surface mit dem Format D3DFMT_A8R8G8B8!
 
So jetzt ist Wochenende und ich hab Zeit zu Coden :-)

Nach etwas genauerm Nachdenken, bin isch zu Schluss gekommen, dass ich den Alphawert in Abhängikeit einer Varialbe definieren muss.
Die Variable wird bei jedem "Zeilenumbruch" um eins erhöht.
Der Verlauf erstreckt sich über 64 pixel, daher muss der Alphawert bei jeder Zeile um 4 verkleinert werden.

Also so etwas wie:

Code:
case TOP:
	for(int n=0;n<64;n++)
	{
		for(int p=0;p<128;p++)
		{
			PixelsUebergang[n * nPitchUebergang + p] |= 0xff000000-n*4;
		}   
	}
	break;

Das funktioniert leider nicht.
Wie wäre denn der richtige Code für " 0xff000000-n*4;"?
Oder ist da sogar sonst noch ein Fehler drin?
 
Wenn du den Alpha-Wert generell von 0 bis 255 angeben willst, dann rechne dir die Maske am besten immer zusammen. Der Compiler optimiert sowieso besser als jeder Mensch.

DWORD dwTempAlpha = 255 - n * 4;

DWORD dwAlphaMaske = ( dwTempAlpha << 24 );

Dabei darf dwTempAlpha natürlich nie grösser als 255 oder kleiner als 0 werden.
 
Hat ein bisschen länger gedauert, es war sonst noch ein Fehler drin.

Leider funktioniert das mit der Transparenz nicht.

Wie müsste ich jetzt das machen wenn ich die Transparenz dieses Pixels verändern möchte?

PixelsUebergang[n * nPitchUebergang + p]
 
Das geht in zwei Schritten: Zuerst den alten Transparenzwert ausmaskieren und dann den neuen reinsetzen:

// Transparenz weg
PixelsUebergang[n * nPitchUebergang + p] &= ~0xff000000;

// neue Transparent setzen
PixelsUebergang[n * nPitchUebergang + p] |= ( dwAlpha << 24 );

Das Beispiel geht vom D3DFMT_A8R8G8B8-Format aus, dwAlpha ist im Bereich von 0 bis 255.
 
hmm da scheint noch ein grundlegenderes Problem vorhanden zu sein.
Anscheinend kann man transparente Surfaces gar nicht so in den Backbuffer kopieren wie ich das mache... oder verstehe ich das falsch?

http://www.zfx.info/DisplayThread.php?TID=19599

Gibt es denn keine Möglichkeit das ein bisschen einfacher zu machen, als mit 3D-Techniken
und Rendering?

Ach ja ich mache es mit der Funktion StretchRect:

Code:
m_lpD3DDevice->StretchRect(VecUebergangSurface[0][0],0,m_lpBackBuffer, &r,D3DTEXF_NONE);

Danke, dass du dich meinem Problem angenommen hast!
 
Zuletzt bearbeitet:
Zurück