|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.07.2004, 17:54 Titel: Alphablending - DirectX9 |
|
|
Hallo,
ich habe wiedermal ein Problem mit DirectX 9. Diesmal geht es um Alphablending. Meine Texturen haben teilweise einen Alphachannel, welcher auch berücksichtigt wird.
Um das Alphablending zu aktivieren habe ich folgende Funktionen aufgerufen:
Code: | g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
Jetzt zu meinem Problem: Ich habe versucht die gesamte Geometrie durchsichtig zu machen. Und zwar mit einem bestimmten Alphawert!
(Ich möchte das Objekt langsam einblenden)
Ich habe das hier versucht:
Code: | g_pD3DDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x80000000);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_BLENDFACTORALPHA); |
Doch das funktioniert leider nicht so richtig...
Was kann ich tun? Ich bin so verzweifelt?
P.s. Mein Vertexformat enthält D3DFVF_DIFFUSE. Damit könnte ich natürlich den einzelnen Vertexecken einen beliebigen Alphawert zuweisen.
Da ich den Alphawert während der Laufzeit ändern möchte, müsste ich meinen Vertexbuffer immer ab- und aufschließen um die Werte ändern zu können.....
Es gibt doch bestimmt noch eine andere Möglichkeit, oder ??? |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.07.2004, 22:37 Titel: |
|
|
Ich hab mich mal im Internet umgeschaut und es geht wohl irgendwie mit
diesem TEXTUREFACTOR oder Material.Diffuse.A.
Falls jemand darin Erfahrung hat kann er mir gerne weiterhelfen.
(Wozu das Rad zweimal erfinden)
Ich würde mich auch über eine Lösung freuen, die etwas mit Shadern zu tun hat...(wo ist FallenAngel nur abgeblieben ...) |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 26.07.2004, 22:40 Titel: |
|
|
Naja, wenn du die Vertexfarben nicht benötigst, dann kannst du ein Material setzen und den Alphawert ändern. Es gibt auch noch D3DBLEND_BLENDFACTOR (dann den Faktor mit D3DRS_BLENDFACTOR setzen - sollte auch gehen).
C. |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.07.2004, 22:54 Titel: |
|
|
Danke für die Antwort. Ich werde es morgen mal probieren. |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 26.07.2004, 23:22 Titel: |
|
|
Ich hab heut doch noch was ausprobiert.. und zwar hab ich den D3DRS_BLENDFACTOR nochmal ausprobiert.
Mit folgendem Code: Code: |
g_pD3DDevice->SetRenderState(D3DRS_BLENDFACTOR, 0x80706040);
g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR);
g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
Die Polygonplatten werden auch transparent, aber die Bereiche die eigentlich durch den Colorkey hätten transparent sein müssen sind sichtbar - egal ob ich 0x80706040 als Faktor benutze oder irgendetwas anderes... Auch die TGA Texturen(mit integriertem Alpha-Channel) sehen plötzlich ganz anders aus.
Mache ich noch irgendwas falsch?
Mein Vertexformat ist:
Code: |
// Definition der CUSTOMVERTEX-Struktur
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // Position
D3DCOLOR color; // Farbe
float tu, tv; // Texturkoordinaten
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
|
wobei ich die Farbe(D3DFVF_DIFFUSE) bisher noch nicht gebraucht habe.
Na dann probier ich das mal mit dem Material.... |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 29.07.2004, 09:46 Titel: |
|
|
KI hat Folgendes geschrieben: | Na dann probier ich das mal mit dem Material.... |
Ich habs jetzt endlich hingekriegt!
Danke nochmal für den Tip und den Beispielcode
Ich hatte noch ein paar Probleme mit den TextureStageStates...
Denn der Alphakanal meiner Texturen wurde nicht ordnungsgemäß berücksichtigt. Jetzt klappt allerdings alles super!
Ich kann ja später mal erklären wie ich das genau gemacht hab....
Und es spricht nichts dagegen, dass es heute Abend eine neue Turtles Version gibts! |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 29.07.2004, 22:03 Titel: |
|
|
Soo.... meine Lösung!
Da ich ja zur Zeit an einem 2D Spiel arbeite konnte ich auf Licht verzichten und habe deshalb auch kein Material benutzt.
Stattdessen habe ich folgendes gemacht:
Code: |
// Definition der CUSTOMVERTEX-Struktur
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // Position
float tu, tv; // Texturkoordinaten
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
|
Code: |
// Lichtberechnung und Selbstbelichtung ausschalten
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pD3DDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE);
// Alphablending aktivieren
g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
// Color Operationen festlegen
g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
// Alpha Operationen festlegen
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
// Als zweites Argument wurde für die Color und die
// Alpha Operationen jeweils D3DTA_TFACTOR übergeben.
// Jetzt kann man über den TEXTUREFACTOR die Farben und
// die Tranzparenz der Objekte (hier: Polygonplatten) einstellen.
g_pD3DDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0xffff0000);
|
0xffff0000 steht z.B. für eine vollständige Sichtbarkeit mit vollem Rot, ohne grün und ohne blau. |
|
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
|