Diffuses Licht mit (Textur+Alpha+Textur) kombinieren



  • Hi!

    Ich hab folgendes Problem: Mein Objekt wird mit zwei Texturen überzogen, wobei
    die zweite durch eine Alphamap nur an einigen Stellen erscheint.

    Jetzt soll das ganze allerdings noch mit diffusem Licht kombiniert werden ohne
    eine weitere Textur-Stage zu verwenden. Ist das überhaupt möglich?

    Wenn ich das Diffuse Licht nur mit der ersten Textur kombiniere, werden die
    Stellen, wo die zweite Textur erscheint nicht beleuchtet.

    Und die zweite kann ich nicht kombinieren, da ich dort bereits das blenden von
    Alpha und Textur übernehme...

    Gibt es kein Ausweg aus diesem Problem?

    MfG,

    EnERgYzEr



  • Probier doch mal etwas im MFCTex rum, ob du das Ergebnis bekommst. Ich denke ich habe das jetzt nicht so ganz verstanden, könntest du das mal als Formel o.ä. angeben?

    Bye, TGGC (Reden wie die Großen)



  • Ich war schon eifrig am probieren mit MFCTex aber das hat bis jetzt zu keinem
    Ergebnis geführt.

    Hier einmal die bisherigen States:

    pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
       pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
       pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
    
       pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
       pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
       pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
       pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    
       pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP,   D3DTOP_BLENDCURRENTALPHA );
       pd3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
       pd3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
       pd3dDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
    

    Ein ganz normales Blenden von zwei Texturen mit Hilfe einer Alphamap.

    Das Problem ist: Ich will jetzt, dass auch noch das Diffuse Licht mit
    eingebunden wird.

    Formel bisher: (Tex1*AlphaTex + Tex2*(1-AlphaTex))
    
    "Wunsch"formel: Diffuse*(Tex1*AlphaTex+Tex2*(1-AlphaTex))
    


  • diffuse kriegt man doch nur über shader mit rein oder?



  • otze schrieb:

    diffuse kriegt man doch nur über shader mit rein oder?

    du meinst in diesem speziellen fall??

    Weil im allgemeinen kannst du ja problemlos eine Textur multiplizieren mit
    Diffuse:

    pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
       pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
       pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    


  • ok, mein fehler, aber wenn du um die 4. texturschicht drum herum kommen willst, wär shader doch auch nich so schlecht oder?

    btw: ist dir aufgefallen, dass du in deinem oberen beispiel kein einziges mal irgendwas mit diffuse verwendet hast?^^



  • otze schrieb:

    diffuse kriegt man doch nur über shader mit rein oder?

    Hihi, irgendwie ist DX ja doch lustig ^^
    Ernsthaft: Für sowas sind Shader wirklich gut geeignet. Ist auch garnicht schwer, in GLSL würde dann ungefähr solche Zeilen in deinem Shader stehen:

    vec3 alpha = texture2D(AlphaTex, texcoord); 
    gl_FragColor = texture2D(Tex1, texcoord)*alpha + texture2D(Tex2, texcoord) * (1.0 - alpha);
    gl_FragColor *= diffuse;
    

    Naja, ist in HLSL oder Cg sicher doch etwas anders, aber so viel bestimmt auch wieder nicht 😉

    EDIT:
    Oops, nicht wirklich guter Code, besser wäre das (auch wenn's hier eh keine Rolle spielt...)

    vec3 alpha = texture2D(AlphaTex, texcoord); 
    gl_FragColor = diffuse * mix( texture2D(Tex2, texcoord), texture2D(Tex1, texcoord), alpha );
    


  • Klar mit Shadern wäre das kein Problem... Nur müsste ich dann diese Zeilen
    in jeden Shader integrieren...

    Damit wäre die offene Gestaltung meiner Engine hinüber.

    Ich kann ja schlecht zu den Usern meiner Engine sagen: "Hey Leute, wenn ihr
    Shader nutzt, dann tragt bitte diese Zeilen ein" 😉

    Ich glaube ich werde wohl eine 4. Stage aufmachen müssen 😞

    @otze: ich wollte nur klar machen, wie es bis jetzt aussieht 🙂



  • IMHO geht das nur in 2 Passes.

    Bye, TGGC \-/


Anmelden zum Antworten