Transparenz durch Vertex-Alpha



  • Hallo,
    ich möchte meinem D3D-Spiel die Möglichkeit geben, verschiedene Modelle transparent zu zeichen.
    Dazu hab ich in meine Klasse CModel die Funktion SetTransparency(float) eingefügt, die jetzt jeden Vertex
    des Modells durchgeht und in den Farbwerten den Alpha-Wert auf den gewünschten Wert
    zwischen 0 und 255 setzt... Zusätzlich geh ich durch alle Materialien des Objekts und
    setze dort die Alpha-Werte aller Farben ebenfalls auf meinen Wert.
    Um Alpha-Blending zu aktivieren, mach ich folgendes in der Render-Routine des Modells:

    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);
    

    Trotzdem zeichnet das Spiel das Modell schwarz und nicht wie ich es angegegeben habe,
    50 % transparent. Muss ich da noch was bestimmtes beachten?

    EDIT: Wenn ich mein Device mit D3DCREATE_SOFTWARE_VERTEXPROCESSING erstellt,
    wird das Objekt komplett schwarz gezeichnet, wenn ich HARDWARE benutze, ist es
    normal sichtbar, nur sehr hell, als wenn es einen hohen Ambient-Wert hat.



  • Lighting ausgeschaltet?



  • Ich habs jetzt ausgeschaltet, jetzt wird das Objekt komplett weiß gezeichnet 😞



  • Hast du als Operation fürs Alphablending "modulate" gesetzt? In deinem Auszug sieht man nicht was du dafür setzt.



  • ich hab grad alles ausprobiert. Es klappt einfach nicht. Ich poste mal am besten ein bisschen mehr Code:

    Hier setze ich die Alpha-Werte der Vertices

    int iAlpha = (int)(fPercent * 2.55f);
    
    m_pMesh->LockVertexBuffer(0, (void**)&m_pVertices));
    for (int i = 0; i < m_iNumVertices; i++)
    {
    	m_pVertices[i].color &= 0x00FFFFFF;
    	m_pVertices[i].color |= (iAlpha << 24);
    }
    m_pMesh->UnlockVertexBuffer();
    

    das Rendern erfolgt hier:

    if (m_fAlpha)
    {
    	m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    	m_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
    	m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    	m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    	m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    	m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
    }
    
    m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
    for(int i = 0; i < (int)m_dNumMtrls; i++)
    {
    	m_pd3dDevice->SetMaterial(m_Materials[i]);
    	m_pd3dDevice->SetTexture(0, m_Textures[i]);
    	m_pMesh->DrawSubset(i);
    }
    
    if (m_fAlpha)
    {
    	m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
    	mm_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
    }
    

    Hoffe diese Zeilen sind hilfreich...

    Norman



  • Ist ja klar:

    Deine Vertex-Farbe ist weiß, d.h. wenn es komplett undurchsichtig (opak) ist, dann ist der Mesh weiß.

    Du berechnest folgendes:

    src_alpha + inv_srcalpha = alpha

    inv_srcalpha = 1 - src_alpha

    somit hast du am Ende immer 1, was opak entspricht

    Du musst eine andere Operation nehmen, für den ersten Test z.B. ein D3DTOP_SELECTARG1



  • Noch immer keine Veränderung, der Code sieht jetzt so aus:

    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_ALPHAOP, D3DTOP_SELECTARG1);
    m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    

    und das Objekt wird noch immer vollständig weiß gezeichnet 😕



  • Was für einen Alphawert hast du denn gesetzt?

    Und was für ne Farbe steht nacher in deinen Vertices, prüf das mal mit dem Debugger.

    btw. Wenn du ein Material gesetzt hast wird standardmäßig die Farbe aus dem genommen, d.h. wenn du nicht von Hand auf die Vertex-Farbe(n) umstellst, dann sind diese uninterressant.



  • ich hab alles geprüft, versucht, die Alphawerte auf drei unterschiedliche
    Arten zu setzen und bekomme immer das gleiche Ergebnis, es wird immer weiß gezeichnet.
    Hilfe!! 😞

    EDIT: wie kann ich denn von Hand auf die Vertex-Farben umstellen?

    m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    

    hab ich das damit nicht gemacht?



  • Mit dem Renderstate D3DRS_DIFFUSEMATERIALSOURCE kannst du angeben ob die Farbe vom Vertex oder vom Material benutzt werden soll. Die Möglichen Werte sind in dem enum D3DMATERIALCOLORSOURCE definiert.

    Hast du auch mal den alpha-wert in deinem Material überprüft? Du hast oben ja geschrieben, dass du beides auf den angegebenen wert setzt.

    Und hast du Alpha-Blending mal in einem Minimalprogramm getestet, bevor du es in deine Modell-Klasse eingebaut hast?


Anmelden zum Antworten