Multitexturing & Transparenz



  • Hallo zusammen,

    ich fange gerade an einen Kartenedito für ein HEX-Feld basierendes Spiel in C/C++ mit OpenGL zu proggen. Jetzt will ich mich mit der Optik der Landschaft beschäftigen... Die Basistextur die auf alle Hexe geklebt ist funktioniert für sich und auch die Detailtexturen (ohne Transparenz) der einzelnen Hexe. Das googeln nach mutitexturing hat auch einige Ergebnisse geliefert aber bis jetzt bin ich mit dem ganzen noch nicht soo glücklick geworden.

    Texturen lade ich aus *.jpg oder *.bmp (bei gewünschter Transparenz wird der Textur ein Alphakanal hinzugefügt abhängig von einem Colorkey)

    Bisher habe ich verschiedene Ansätse verfolgt

    Ausgangspunkt:

    glActiveTextureARB(GL_TEXTURE0_ARB);
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D,m_TerrainTex.Handle);
    
    	glActiveTextureARB(GL_TEXTURE1_ARB);
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D,m_DetailTex[0].Handle);
    
             	[render snip]
             glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3]);
    	glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3]);
             glVertex3fv(P1);
    
    	glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3+1]);
    	glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3+1]);
    	glVertex3fv(P2);
    
    	glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3+2]);
    	glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3+2]);
    	glVertex3fv(P3);
             [/render snip]
    

    wie das dann auschaut kann sich sicher jeder vorstellen...

    In der Detailtextur ist ein Alpakanal enthalten (Textur gebaut mit GL_RGBA) wie ich gelesen hab ist ein nicht existenter Alphakanal als 1.0f als Alhawert interpretiert (Basistextur)

    das einfachste was ich gefunden hab war...

    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    

    das hat bei mir leider garnichts bewirkt was mach ich falsch oder muss das so sein 😕 Ist das nur für multipass tauglich?

    dann bin ich auf was gestoßen was ich dann gar nicht mehr begreifen konnte das hat dann aber einen teil des gewünschten Effektes erzielt ...

    alles was Alphakanal 0.0f hat ist transparent geworden aber alle anderen Fraben werden immer noch zu einer Mischfarbe kombiniert

    // Init texture unit 1
    
        glActiveTexture( GL_TEXTURE1 );
        // Set up texture function for RGB and alpha channel
    
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV );
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD );
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE );
        // Interpolate the RGB components of the first and second texture
    
        // using the alpha primary color
    
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR );
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_ZERO );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_ONE_MINUS_SRC_COLOR );
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, GL_PREVIOUS_EXT );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA );
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE3_RGB_NV, GL_TEXTURE );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND3_RGB_NV, GL_SRC_COLOR );
        // Replace the alpha component
    
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_EXT );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, GL_SRC_ALPHA );
    

    muss das so kompiziert sein oder geht es auch einfacher?

    Danke im Vorraus

    Ich hoffe hier sieht noch wer durch aber ich musste mir das jetzt von der Seele schreiben 😉


Anmelden zum Antworten