[DirectX c++] Alpha Blending png

Noch etwas:
Jetzt werden alle Vertices mit den Texturen korrekt angezeigt. Jetzt muss nur noch der Alphakanal der PNGs berücksichtigt werden, damit ich dann auch Transparenz habe....
Wie kann ich das machen oder wo soll ich mit Suchen beginnen?

Noch mal TXH!!
 
Da musst du nur die RenderStates passend setzen, das Alpha sollte durch das Laden mit D3DXCreateTextureFromFile schon drin sein

Sollte ausreichen:
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_SRCDEST, D3DBLEND_INVSRCALPHA );
pDevice->SetRenderState( D3DRS_D3DRS_ALPHABLENDENABLE, TRUE );
 
Irgendwas kapier ich bei deinem Testschnipsel oben nicht:

Du baust einmal am Anfang einen VertexBuffer, wo du die aktuellen Vertices reinkopierst. In deiner Draw-Routine berechnest du dann immer neue Vertices, die Darstellung mit DrawPrimitive kommt aber aus dem Vertexbuffer (der immer noch die allerersten Anfangsdaten hat).
Entweder du kopierst die Vertices in Draw immer wieder neu in den VertexBuffer oder du benutzt DrawPrimitiveUP mit dem Vertices-Daten (was dann intern von DirectX über VertexBuffers gelöst wird).


Noch ein Nachtrag, das AlphaBlendEnable, das ich oben angegeben habe, ist für volles Alpha-Blending gedacht, also nicht nur Pixel da oder weg, sondern mit Alpha-Werten dazwischen ebenso (für transparente Flächen). Du scheinst das bei dir ja nicht wirklich zu benötigen, da kannst du auf Alpha-Testing ausweichen (das prüft nur ob Alpha an oder aus ist), das wird auf einigen Karten dann doch wesentlich schneller laufen (da muss die Karte nicht die Farbwerte zusammenrechnen, sondern einfach ein Pixel setzen oder eben nicht).

Alphatesting aktivierst du so:

pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );

Zusätzlich am besten gleich die Vergleichsfunktion und den Vergleichswert setzen (die Schwellwerte für die Alpha-Prüfung):

pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
pDevice->SetRenderState( D3DRS_ALPHAREF, 8 );

Hintergrund: Bei Alphatesting vergleich die Karte das Alpha aus der Textur mit der angegebenen Vergleichsfunktion gegen den Referenzwert. Ist der Alphawert darüber, wird der Pixel angezeigt, ist er drunter, dann nicht.
 
Ja, im Code oben ist noch einiges falsch.
Der Neue Code wurde ziemlich verändert.

Das mit dem Alphablending werde ich mir noch anschauen, bin mir auch noch nicht ganz sicher wie ich es dann mit Texturübergängen machen will.

Ich schreibe oben mal den aktuellen Code rein, weiss nicht ob die Moderatoren hier Freude haben wenn ich alles noch mal neu reinkopiere ;)
 
Hm, was ich im Code sehe bzw. nicht sehe ist für den ersten Vertex die Zeile:

vertices[VertexIndex].rhw = 1.0f;

Noch eine Anmerkung: Wenn du deine Texturen tinten (einfärben) willst, kannst du das über die Diffuse-Farbe machen. Die hast du in deinem Fall auf 0x00000000 gesetzt. Beachte, dass die Farbe bei aktiviertem Alphablending komplett unsichtbar ist (Alpha = 0!). Das passiert aber nur, wenn du die Stages so eingestellt hast, dass Texture und Diffuse moduliert werden (COLOROP = D3DTOP_MODULATE).
 
Oh ja, stimmt, ändert aber nichts.
Ich kapier etwas bei den Texturkoordinaten nicht ganz ( tu und tv).

1.Ich brauche ja eigentlich 4 Texturkoordinaten und habe 6 Vertices, von denen jedes eine Texturkoordinate hat...

2.Spielt es eine Rolle, wo ich beim Definieren der Dreiecke beginne? (and welcher der drei Ecken)

Edit:

IIIIIHHHHAAA

Der 2. Punkt war das Problem.

So ist die richtige Reihenfolge:

Code:
					//Vertices für die Texturen
					
					// Unten links
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll);
					vertices[VertexIndex].y		= float(y-y_Scroll+TILE_HEIGHT);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 0.0f;
					vertices[VertexIndex].tv	= 1.0f;
					VertexIndex++;
					// Oben links
					
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll);
					vertices[VertexIndex].y		= float(y-y_Scroll);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 0.0f;
					vertices[VertexIndex].tv	= 0.0f;
					VertexIndex++;
					// Oben rechts
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll+TILE_WIDTH);
					vertices[VertexIndex].y		= float(y-y_Scroll);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 1.0f;
					vertices[VertexIndex].tv	= 0.0f;
					VertexIndex++;
					
					// Unten rechts
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll+TILE_WIDTH);
					vertices[VertexIndex].y		= float(y-y_Scroll+TILE_HEIGHT);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 1.0f;
					vertices[VertexIndex].tv	= 1.0f;
					VertexIndex++;
					// Unten links
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll);
					vertices[VertexIndex].y		= float(y-y_Scroll+TILE_HEIGHT);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 0.0f;
					vertices[VertexIndex].tv	= 1.0f;	
					VertexIndex++;
					
					// Oben rechts
					vertices[VertexIndex].color = 0xffff0000;
					vertices[VertexIndex].x		= float(x-x_Scroll+TILE_WIDTH);
					vertices[VertexIndex].y		= float(y-y_Scroll);
					vertices[VertexIndex].z		= 0.5f;
					vertices[VertexIndex].rhw	= 1.0f;
					vertices[VertexIndex].tu	= 1.0f;
					vertices[VertexIndex].tv	= 0.0f;
					VertexIndex++;

				x += TILE_WIDTH;
 
Zuletzt bearbeitet:
ThE pRiSoN iN mInD hat gesagt.:
Oh ja, stimmt, ändert aber nichts.
Ich kapier etwas bei den Texturkoordinaten nicht ganz ( tu und tv).

1.Ich brauche ja eigentlich 4 Texturkoordinaten und habe 6 Vertices, von denen jedes eine Texturkoordinate hat...

2.Spielt es eine Rolle, wo ich beim Definieren der Dreiecke beginne? (and welcher der drei Ecken)

2. Wenn Culling aktiviert ist (Standart), dann müssen Dreiecke im Uhrzeigersinn definiert sein, damit sie gezeichnet werden. Das ist eine Optimierung für 3D Grafik, dass unnötige Dreicke nicht gezeichnet werden.

1. Da es ja nur 2D Grafik ist, ist das Zuordnen der Texturkoordinaten einfach.

Die die Links oben sind

0|0

Rechts oben

1|0

Rechts unten

1|1

Links unten

0|1
 
hmm
So wie du das beschrieben hast würde es aber oben auch schon stimmen, oder sehe ich da etwas falsch?

Oben werden auch zwei Dreiecke im Uhrzeigersinn definert und die Texturkoordinaten sollten richtig sein.

Deinzige Unterschied ist, dass die Diagonale, die das Rechteck in zwei Dreiecke teilt eine andere ist und, dass ich bei einer anderen Ecke mit definieren beginne.
Irgendwie muss es also auch noch damit zusammenhangen.
Durchschaut hab ich das Ganze aber noch nicht...

Aus reiner neugier würde ich schon gerne wissen, warum es jetzt funktioniert und vorher nicht.
 
Zurück