DirectX 9: teiltransparente Kugel ist abhängig vom Blickwinkel



  • Hab eine Anwendung mit einem texturierten Raum in dem sich eine zu 50% transparente Kugel befindet. Mein Vertex Format beinhaltet PositionsVector, Farbwert und Texturkoordinaten. Wobei die Kugel letzteres nicht nutzt sondern nur eine Farbe.

    Mein Problem ist nun das die Kugel abhängig vom Blickwinkel, bzw der Kameraposition, anders aussieht. Befindet sich die Kamera oberhalb der Kugel, so sieht man nur die Vorderseite. Man schaut zwar durch diese hindurch, aber die Rückseite der Kugel scheint gar nicht berechnet zu werden. Befindet sich die Kamera nun unterhalb der Kugel, so ist die transparenz bedeutend geringer, da auch die Rückseite mit berechnet wird. Man schaut also durch Vorder- und Rückseite und danach erst auf die dahinterliegende Wand.

    Befindet sich die Kamera auf Höhe der Kugel, so wird bei der oberen Hälfte durch Vorder- und Rückseite geschaut, bei der unteren nur durch die Vorder- oder Rückseite. (Was natürlich einen deutlichen Unterschied macht)

    Um das Ganze mal zu veranschaulichen hab ich einen Screenshot hier hochgeladen:
    Bild

    Das Ganze ist bei aktiviertem und deaktiviertem Z-Buffer der Fall. Die Kugel selbst ist im LineStrip Verfahren gerendert.

    Hat jemand eine Idee woran das liegen könnte und wie man es beheben kann?
    Ich geb mal noch die Einstellungen mit:

    for(unsigned i = 0; i < 8; ++i)
    	{
    		m_pD3DDevice->SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    		m_pD3DDevice->SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    		m_pD3DDevice->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_ANISOTROPIC);
    		m_pD3DDevice->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, m_Config.GetAnisotropy());
    	}
    
    	m_pD3DDevice->SetRenderState(D3DRS_AMBIENT, RGB(255,255,255));		m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);	
    	m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);	
    	m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);	
    
    	m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);	
    	m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    	m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    
    	m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    


  • Das liegt an deinem Alpha-Blending.
    Entweder verwendest du eine Blending-Einstellung, bei der es egal ist, in welcher Reihenfolge sich überdeckende Pixel gezeichnet werden (rein additives Blending), oder - und das sollte die für dich interessantere Lösung sein - du renderst zuerst nur die Rückseite und dann nur die Vorderseite (D3DRS_CULLMODE).

    Achja: Du solltest den Z-Test nicht abschalten, sondern nur das Schreiben in den Z-Buffer. Das geht mit D3DRS_ZWRITEENABLE. Denn sonst würden transparente Objekte auch hinter einer Mauer zu sehen sein.



  • hm also nochmal zusammen...
    rein additives Alphablending und Z-Buffer enabled aber mit writenable nicht beschreiben lassen...

    versuch ich mal



  • Das mit den erst Rückseite und dann Vorderseite rendern hat funktioniert. DANKE!

    Vielen Dank wirklich, das hatte mich bereits an den Rande des Wahnsinns getrieben.



  • rückseite/vorderseite funktioniert allerdings nur wenn deine objekte rein konvex sind. und: mehrere transparente objekte musst du z-sortieren.



  • Nein es handelt sich nur um ein Objekt. Klappt auch alles jetz tadellos. Bis auf ne ganz andre Problematik. Aber das ist wieder nen andres Thema.

    Irgendwie kann ich nämlich während der Anwendung die Texturkoordinaten nicht ändern, wenn die Anwendung im Hardware-Modus läuft. Keine Ahnung woran das liegt. nur im Softwarevertexprocessing modus klappts problemlos.

    EDIT gelöst... hat sich irgendwie von selbst erledigt.

    Das einzige Problem was noch bleibt, ist das die Anwendung nach verlassen des Vollbildmodus weiterhin dessen Auflösung behält. (siehe anderen thread in WinApi Bereich)


Anmelden zum Antworten