Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.11.2007, 14:47

Trickie Alphablending-Problem

Ich möchte mittels eines texturierten Vertexquads ein pulsierendes Blinklicht simulieren. Das Ein- und Ausblenden habe ich wie folgt gelöst:

Quellcode

1
2
3
4
5
SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);           
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVBLENDFACTOR);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_ADD);
SetRenderState(D3DRS_BLENDFACTOR, dwBlendValue);


Vertexquad transparent = Licht aus, opaque = Licht an
Das pulsiert auch wunderbar und butterweich, allerdings ist die Textur selbst nicht transparent. Wie bekomme ich das Schwarz weg?


(Link)


(Link)


Wie im unteren Bild sollte das ausshen...
Bin schon ganz banane vom vielen Rumprobieren :oops:
Danke schon mal für eure Tipps!
fka tm

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

09.11.2007, 16:36

mit alphatesting.

beim laden der textur übergibst du bei D3DXCreateTextureFromFileEx bei colorkey den wert 0xff000000.

dann stellst du alpkatesting an + standardeinstellung. wie folg geht das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); 

//rendern


dev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);

3

09.11.2007, 17:02

Geht so leider auch nicht...
Hatte ich zuvor auch schon (wie so Vieles) ausprobiert.

Zur Info:
Bild ist im JPG-Format (dds, png, tga, tif, jeweils mit und ohne Alphakanal hab ich auch schon durch)
Colorkey schwarz (auch mit weiss getestet)
Vertexfarbe weiss (auch mit schwarz getestet)
Vertexformat D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1

Damke dir trotzdem!
fka tm

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

09.11.2007, 17:29

also meines wissens geht es auch irgendwie mit alphablending, aber ich mache es persönlich mit alphatesting.

ist ja logisch das gleiche, aber probier ma das anstelle:

C-/C++-Quelltext

1
2
SetRenderState(D3DRS_ALPHAREF,0x0000);
SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_NOTEQUAL);


also ich würde dir noch ein paar dinge sagen, die du nochma gukcen kannst, beim krampfhaftesten suchn vergisst man oft das hirnrissigste, kenn das ;)

1. hast du wirklich 0xff00000 bei createtexturefromfileEx angegeben?
2. ist dein bild wirklich aussenrum mit dem 0xff000000 gefüllt?

5

09.11.2007, 17:54

ColorKey bei CreateTextureFromfileEx = 0xFF000000
Was meinst du mit "ist dein bild wirklich aussenrum mit dem 0xff000000 gefüllt?" ?

Mit D3DCMP_NOTEQUAL oder bei CreateTextureFromFile gehts ooch nich...

So ist das, wenn man sich einmal in was verrannt hat (obwohl ich schon 'ne Nacht drübergeschlafen habe) ...
Aber das sieht so geil aus, daß ich mich noch nicht von der Idee trennen möchte.
Wenn ich übrings D3DBLEND_BLENDFACTOR und D3DBLEND_INVBLENDFACTOR vertausche,
ist es zwar bei "eingeschaltet" transparent, aber abgedimmt dann schwarz :shock:
Grrrr...
fka tm

6

09.11.2007, 19:09

bei JPEGs ist es oft so, dass der hintergrund nicht 100% schwarz ist.

du solltest einfach mal mit einer anderen farbe(z.B. weiß) den hintergrund füllen(im Grafik programm), dann siehst du die Stellen, die nicht in der gleichen farbe sind. die musst du dann mit der gewählten farbe überzeichnen und dann mit dem der Farbe für die du transparenz gewählt hast füllen

schätze genau das war mit "ist dein bild aussenrum mit dem 0xff000000 gefüllt?" gemeint

7

09.11.2007, 19:48

Danke für eure Tipps! Hab das Problem so gelöst:

Mit dem DirectX Texture Tool eine DDS im Format A8R8G8B8 erstellt
Farb-JPG auf die Surface und SW-JPG auf den Alpha Channel der Surface

D3DXCreateTextureFromFileEx mit D3DFMT_A8R8G8B8 ausgeführt (D3DX_FILTER_NONE, ColorKey 0x00000000)

Wie folgt gerendert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);           
SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000080);
SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVBLENDFACTOR);
SetRenderState(D3DRS_BLENDFACTOR, dwBlendValue);


Der ColorKey und die Vertexfarbe ist DirectX im vorliegenden Fall übrings sowas von egal. Ob schwarz ob weiss...

Irgendwie war ich schon nah dran an der Lösung. Aber ihr wisst ja, wie das ist. x hoch n Kombinationsmöglichkeiten, irgendwo ein falsches Flag gesetzt, ... :shock:
fka tm

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

10.11.2007, 13:04

Ich vermute du bist von einem Farbwert ausgegangen, den es anscheinend so nicht gab. Weil 0x00000000 ist ja was ganz anderes als 0xFF000000 ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

10.11.2007, 13:12

Ich hab daran rumgeschraubt bis zum Erbrechen :x
Der Farbwert ist irgendwie so übrig geblieben und hat z.Zt. garkeinen Einfluss, nur die Vertexfarbe...
Aber jetzt blinkts ja wie es soll :D
fka tm

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

10

11.11.2007, 15:46

Zitat von »"Mr. Data"«

bei JPEGs ist es oft so, dass der hintergrund nicht 100% schwarz ist.


das meinte ich damit. gut, dass dein problem gelöst ist ;)

Werbeanzeige