OpenGL - Alpha Blending



  • Hey,

    und zwar (es geht immernoch um meinen Quake 3 bsp Loader) habe ich Probleme beim Blending.

    Ich will diese beiden Texturen per Multitexturing übereinander blenden ( so steht es im Shaderscript):
    1. Feuer - http://bloody-blades.de/images/firegorre.jpg
    2. Türrahmen - http://bloody-blades.de/images/skullarch_b.jpg
    (Die Texturen sind eigentlich TGAs und haben Alphakanäle).

    So soll das ganze aussehen:
    http://bloody-blades.de/images/blending_soll.jpg
    (In der Mitte habe ich mit weiß die transparenten Stellen hervorgehoben)

    Aber das ganze sieht dann so aus:
    http://bloody-blades.de/images/blending_ist.jpg

    Jetzt frage ich mich halt, was das Problem ist, da ich meine Rendering(Blending)-States genauso gesetzt hab, wie im Shader beschrieben.

    Ich habe auch schon ein bisschen im Internet geforscht und (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) müsste genau das richtige für meine Bedürfnisse sein (und es steht ja sowieso im Shaderscript von Q3).

    Die Textur lade ich auch mit RGBA, also da liegt das Problem schonmal nicht!

    Vielleicht könnt ihr mir helfen....
    Vielen Dank,
    Tim

    Hier mein Code:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
    		glLoadIdentity(); // Reset The Current Matrix
    
    		glTranslatef(0.0f,0.0f,-4.0f);                                     // Move Into The Screen 5 Units
    
    	// Flammentextur	
            glActiveTextureARB(GL_TEXTURE0_ARB);
            glEnable(GL_TEXTURE_2D);
            glColor3f(1.0f, 1.0f, 1.0f);
            glBindTextureGL_TEXTURE_2D, flamesID);
            glBlendFunc(GL_ONE, GL_ZERO);
            glEnable(GL_BLEND);
    
            // Türbogentextur
            glActiveTextureARB(GL_TEXTURE1_ARB);
            glEnable(GL_TEXTURE_2D);
            glColor3f(1.0f, 1.0f, 1.0f);
            glBindTexture(GL_TEXTURE_2D, doorID);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            glEnable(GL_BLEND);
    
    		// Draw quad
            glBegin(GL_QUADS);  
    
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); 
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f,  1.0f);    // Bottom Left Of The Texture and Quad
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f);
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f);
            glVertex3f( 1.0f, -1.0f,  1.0f);    // Bottom Right Of The Texture and Quad
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f); 
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f);
            glVertex3f( 1.0f,  1.0f,  1.0f);    // Top Right Of The Texture and Quad
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f); 
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
            glVertex3f(-1.0f,  1.0f,  1.0f);    // Top Left Of The Texture and Quad
    
            glEnd();
    


  • Blending funktioniert nicht pro Textureinheit.

    Um den gewünschten Effekt zu erzielen wird Quake3 wohl Multipass-Rendering verwenden: Du renderst im 1. Pass die Flammentextur normal opak und im 2. Pass die Türbogentextur mit Blending und glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

    Es gibt wahrscheinlich noch die Möglichkeit so Extensions wie "GL_ARB_texture_env_combine" zu benutzen, mit denen man zusätzliche Möglichkeiten hat Texel Units in der Fixed Function Pipeline zu kombinieren (standardmäßig kennt OpenGL wenn mich nicht alles täuscht ja nur GL_REPLACE, GL_MODULATE und GL_ADD). Dann kannst du die Texturen tatsächlich in 1 Render-Pass kombinieren. Diese Extensions sind aber teilweise nicht gerade benutzerfreundlich.

    Am modernsten wäre es sicherlich richtige Shader zu benutzen, da sind dir in den Kombinationen der Texel Units keine Grenzen gesetzt.



  • Okay vielen Dank, mit MultipassRendering klappt's wunderbar...

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
    		GL11.glLoadIdentity(); // Reset The Current Matrix
    
    		GL11.glTranslatef(0.0f,0.0f,-4.0f);                                     // Move Into The Screen 5 Units
    
            // Feuer zeichnen
            GL11.glColor3f(1.0f, 1.0f, 1.0f);
            GL11.glBindTexture(GL11.GL_TEXTURE_2D, flamesID);
            GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
            GL11.glEnable(GL11.GL_BLEND);
    
            GL11.glBegin(GL11.GL_QUADS);                
            GL11.glTexCoord2f(0.0f, 0.0f);         
            GL11.glVertex3f(-1.0f, -1.0f,  1.0f);    // Bottom Left Of The Texture and Quad
            GL11.glTexCoord2f(1.0f, 0.0f);      
            GL11.glVertex3f( 1.0f, -1.0f,  1.0f);    // Bottom Right Of The Texture and Quad
            GL11.glTexCoord2f(1.0f, 1.0f);         
            GL11.glVertex3f( 1.0f,  1.0f,  1.0f);    // Top Right Of The Texture and Quad
            GL11.glTexCoord2f(0.0f, 1.0f);         
            GL11.glVertex3f(-1.0f,  1.0f,  1.0f);    // Top Left Of The Texture and Quad        
            GL11.glEnd();
    
            // Tür zeichnen
            GL11.glColor3f(1.0f, 1.0f, 1.0f);
            GL11.glBindTexture(GL11.GL_TEXTURE_2D, doorID);
            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
            GL11.glEnable(GL11.GL_BLEND);
    
            GL11.glBegin(GL11.GL_QUADS);                
            GL11.glTexCoord2f(0.0f, 0.0f);         
            GL11.glVertex3f(-1.0f, -1.0f,  1.0f);    // Bottom Left Of The Texture and Quad
            GL11.glTexCoord2f(1.0f, 0.0f);      
            GL11.glVertex3f( 1.0f, -1.0f,  1.0f);    // Bottom Right Of The Texture and Quad
            GL11.glTexCoord2f(1.0f, 1.0f);         
            GL11.glVertex3f( 1.0f,  1.0f,  1.0f);    // Top Right Of The Texture and Quad
            GL11.glTexCoord2f(0.0f, 1.0f);         
            GL11.glVertex3f(-1.0f,  1.0f,  1.0f);    // Top Left Of The Texture and Quad        
            GL11.glEnd();
    
    		Display.update(); // Update the display
    

Anmelden zum Antworten