Alpha Verständnisproblem



  • Hallo hab da ein Alphaproblem...

    Eigentlich hätte ich gedacht dass wenn Alpha 1 ist dass dann die Vertizes nicht mehr transparent gerendert werden. Stimmt bei mir soweit auch aber nur wenn RGB 1 sind... Wenn ich aber zum Beispiel nur die Farbe Grün auf 1 setze und Rot und Blau auf 0 -> will einen grünen Text dann sind die Vertizes nicht mehr ganz transparent... Siehe Bild: http://www2.students.fh-vorarlberg.ac.at/~tst8639/stuff/alphaprob.jpg
    Wie kann ich das ganze nicht mehr Transparent auf den Bildschirm bringen sprich ich will den Text weich auf den Bildschirm zeichnen also von Alpha 0 bis 1 durchgehen aber eben bei 1 keine Transparenz mehr...



  • Vertizes sind die Eckpunkte, und die werden (zumindest im Solid Modus) nicht gerendert. Von daher verstehe ich nicht, was die Frage/ das Probelm ist.

    Bye, TGGC (Der Held lebt!)



  • hmmm... wie sieht deine blendfunktion im moment aus?



  • Ja vielleicht habe ich mich falsch ausgedrückt. Mir geht es nicht um die Vertizes...
    Mein Problem ist dass wenn ich zum Beispiel eine weiße Textur im Vordergrund auf den Bildschirm bringe und Alpha dabei auf eins setze dass dann die Textur alles überdeckt was auch gut so ist.
    Aber wenn es jetzt ne rote Textur ist ist der Hintergrund nicht ganz überdeckt klar es gibt ja auch noch Rot und Grün im Hintergrund aber eigentlich müsste doch vom logischen her wenn Alpha eins ist also nicht transparent doch alles rot sein...

    Vielleicht ein bischen Code zum besseren Verständnis des Problems:

    Mesh[0] = D3DLVERTEX( ... );
    Mesh[1] = D3DLVERTEX( ... );
    Mesh[2] = D3DLVERTEX( ... );
    Mesh[3] = D3DLVERTEX( ... );	
    
    Mesh[0].color = Mesh[1].color = Mesh[2].color = Mesh[3].color = 
                             D3DRGBA(	1.0f, //r
    					1.0f, //g
    					1.0f, //b 
    					1.0f); //alpha
    
    lpDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    
    //dies funktioniert wunderbar!!!
    lpDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, D3DFVF_LVERTEX, Mesh, 4, 0 );
    
    //***************
    Mesh[0].color = Mesh[1].color = Mesh[2].color = Mesh[3].color = 
                             D3DRGBA(	1.0f, //r
    					0.0f, //g
    					0.0f, //b 
    					1.0f); //alpha
    
    lpDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    
    //dies funktioniert nicht mehr wunderbar!!! grün und blau im Hintergrund noch 
    //sichtbar
    lpDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, D3DFVF_LVERTEX, Mesh, 4, 0 );
    


  • da kann ich nur nochmal fragen: ist die blendfunktion auch wirklich so gesetzt, daß sie den alpha wert und eben NICHT die farbe verwendet?



  • @Trienco: ???



  • dali schrieb:

    @Trienco: ???

    irgendwo in deinem code wirst du entweder d3d sagen, wie es die "neue" farbe, die grade gesetzt werden soll und die "alte", die an der stelle im bild schon besteht kombinieren soll. und wenn nicht, dann gilt der default, falls der aber color und nicht alpha benutzt, dann kannst du am alpha soviel schrauben wie du willst und er wird eh nie benutzt.



  • Ja du meinst das hier:

    lpDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    lpDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
    lpDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    

    Ist mir schon klar dass die alten Farben mit den neuen Multipliziert werden und dass dann die anderen Farbwerte auch noch mitspielen. Ich weiß aber nicht wie ich die anderen weg kriegen soll 😞



  • wenn ich das meinen würde, dann hätte ich nicht nach dem code nochmal gefragt.

    d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);



  • Ja ich habe irgendwie meine Probleme mit diesen Renderstates. Hab alle durchprobiert auch deine bei denen dies heraus kommt:
    http://www2.students.fh-vorarlberg.ac.at/~tst8639/stuff/blendprobl.jpg
    Sind diese Renderstates wirklich so schwer zum verstehen 😡 😡 😡 😡



  • dali schrieb:

    Ja ich habe irgendwie meine Probleme mit diesen Renderstates. Hab alle durchprobiert auch deine bei denen dies heraus kommt:

    aber doch hoffentlich zusätzlich und nicht stattdessen? die beiden haben nämlich ziemlich gar nichts miteinander zu tun.

    http://www2.students.fh-vorarlberg.ac.at/~tst8639/stuff/blendprobl.jpg
    Sind diese Renderstates wirklich so schwer zum verstehen 😡 😡 😡 😡[/quote]

    jetzt wird halt gar nicht mehr beblendet und die texturkoordinaten sind viel zu großzügig (ich rate: du willst alle buchstaben gleich breit machen?)

    das ist 08/15 zusammenblenden. die "neue" (src) farbe wird mit alpha multipliziert, die "alte" (dst) mit 1-src.alpha und zusammenaddiert.

    das was schon da war, moduliert (oder auch einfach: 😉 den diffus-teil der vertex farbe und die farbe der textur (gibts da eigentlich wirklich keine konstante, um das für farbe und alpha auf einmal zu machen?)

    ist halt vom setup recht häßlich und dank shader mehr oder weniger hinfällig, jetzt würde da sinngemäß sowas stehen wie:

    mul out, tex, fragment.color

    oder wenn mans in höheren sprachen machen will

    out = tex*fragment.color

    wie aber DANN das neue "pixel" mit dem alten verwurschtet wird gibt die blendfunktion vor (soferns denn aktiv ist).



  • Also ich würde erstmal die entsprechenden Abschnitte der DXSDK Doku lesen (und verstehen!). Danach kann man alles schön mit dem MFCtex-Tool ausprobieren.

    Bye, TGGC (Dem beste BdT)



  • Ok erstmals danke für die Antworten


Anmelden zum Antworten