JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=0cd174ba539047aa4e6abb214adeb501Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Alphablending - DirectX9

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 26.07.2004, 17:54    Titel: Alphablending - DirectX9 Antworten mit Zitat

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... Sad
Was kann ich tun? Ich bin so verzweifelt? Confused


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 26.07.2004, 22:37    Titel: Antworten mit Zitat

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. Smile
(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 Rolling Eyes ...)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 26.07.2004, 22:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 26.07.2004, 22:54    Titel: Antworten mit Zitat

Danke für die Antwort. Ich werde es morgen mal probieren. Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 26.07.2004, 23:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 29.07.2004, 09:46    Titel: Antworten mit Zitat

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 Smile

Ich hatte noch ein paar Probleme mit den TextureStageStates... Confused
Denn der Alphakanal meiner Texturen wurde nicht ordnungsgemäß berücksichtigt. Jetzt klappt allerdings alles super! Very Happy

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! Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 29.07.2004, 22:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum