A forma como estas duas componentes interagem é controlada pela equação <strong>de</strong> blending:C f = (C S ∗ S) + (C D ∗ D)Em que C f é a cor resultante, C S é a source color, C D é a cor <strong>de</strong> <strong>de</strong>stino, S e D são os factores <strong>de</strong> blending<strong>de</strong> origem e <strong>de</strong>stino. Estes factores são configurados com a função:glBlendFunc ( int source_function , int <strong>de</strong>stination_function );Os valores possíveis para os factores estão enumerados na Tabela 6.1.Function RGB Blend Factors Alpha Blend FactorGL ZERO (0, 0, 0) 0GL ONE (1, 1, 1) 1GL SRC COLOR (R S , G S , B S ) A SGL ONE MINUS SRC COLOR (1, 1, 1)–(R S , G S , B S ) 1–AsGL DST COLOR (R D , G D , B D ) A DGL ONE MINUS DST COLOR (1, 1, 1)–(Rd, Gd, Bd) 1–A DGL SRC ALPHA (A S , A S , A S ) A SGL ONE MINUS SRC ALPHA (1, 1, 1)–(As, As, As) 1–A SGL DST ALPHA (Ad, Ad, Ad) AdGL ONE MINUS DST ALPHA (1, 1, 1)–(Ad, Ad, Ad) 1–AdGL CONSTANT COLOR (Rc, Gc, Bc) AcGL ONE MINUS CONSTANT COLOR (1, 1, 1)–(Rc, Gc, Bc) 1–AcGL CONSTANT ALPHA (Ac, Ac, Ac) AcGL ONE MINUS CONSTANT ALPHA (1, 1, 1)–(Ac, Ac, Ac) 1–AcGL SRC ALPHA SATURATE (f, f, f) f=min(AS ,1−A D ) 1Tabela 6.1: Factores <strong>de</strong> Blending do OpenGLComo os valores RGBA são floats (0 ❀ 1) as operações <strong>de</strong> soma e subtracção continuam a gerar valoresválidos.Ao seleccionar uma das opções GL CONSTANT COLOR, GL ONE MINUS CONSTANT COLOR, GL CONSTANT ALPHA, eGL ONE MINUS CONSTANT ALPHA, po<strong>de</strong>mos introduzir uma cor constante no blending. A cor inicialmente é black(rgba(0, 0, 0, 0)), para alterar essa cor utilizamos:glBlendColor ( float red , float green , float blue , float alpha );Um exemplo comum <strong>de</strong> configuração da função <strong>de</strong> blending po<strong>de</strong>ria ser:glBlendFunc ( GL2 . GL_SRC_ALPHA , GL2 . GL_ONE_MINUS_SRC_ALPHA );Neste caso a source color (RGBA) seria multiplicada pelo seu valor alpha (GL SRC ALPHA). A <strong>de</strong>stinationcolor seria multiplicada por 1 menos o valor do seu alpha (GL ONE MINUS SRC ALPHA). O resultado final seria asoma das duas cores. Por exemplo:C S = rgba (0 , 0, 1, .5) ⇒ GL_SRC_ALPHA ⇒ S = 0.5C D = rgba (1 , 0, 0, 0) ⇒ GL_ONE_MINUS_SRC_ALPHA ⇒ D = 1 - 0.5Como C f = (C S ∗ S) + (C D ∗ D) temos:C f = ( Blue * 0.5) + ( Red * 0.5)Para o exemplo a cor final será uma mistura das duas cores (vermelho + azul). Quanto maior for o valor S,maior será o valor da source color na mistura.O blending é normalmente utilizado para conseguir a ilusão <strong>de</strong> transparência. Tal ilusão po<strong>de</strong> ser conseguida,ligando o blending ao <strong>de</strong>senhar o objecto transparente. O código em baixo utiliza a estrutura do Example0adicionando um segundo torus com blending:// Limpar o fundo da janela com a cor <strong>de</strong>finidagl. glClear ( GL2 . GL_COLOR_BUFFER_BIT | GL2 . GL_DEPTH_BUFFER_BIT );gl. glMaterialfv ( GL2 . GL_FRONT , GL2 . GL_SPECULAR , fBrightLight , 0);gl. glPushMatrix ();gl. glLightfv ( GL2 . GL_LIGHT0 , GL2 . GL_POSITION , fLightPos . toArray () , 0);59
Desenhar um Torus Ver<strong>de</strong>gl. glColor4f (0 , 1f, 0, .5f);drawWorld (gl );// Desenhar um Torus Vermelho com Blendinggl. glPushMatrix ();gl. glTranslatef (.1f, 0, .3f);gl. glEnable ( GL2 . GL_BLEND );gl. glBlendFunc ( GL2 . GL_SRC_ALPHA , GL2 . GL_ONE_MINUS_SRC_ALPHA );gl. glColor4f (1f, 0, 0,drawWorld (gl );.5f);gl. glDisable ( GL2 . GL_BLEND );gl. glPopMatrix ();gl. glColor4f (0.60f, .40f, .10f, .5f);GlUtil . drawGround ( FloorSize , 1f);gl. glPopMatrix ();O resultado do código em cima será o da Figura 6.2.Figura 6.2: Exemplo <strong>de</strong> BlendingModificando ligeiramente o código anterior, po<strong>de</strong>mos obter a sensação <strong>de</strong> reflexão:gl. glPushMatrix ();// Desenhar a luz Invertida ( mirror Y)gl. glLightfv ( GL2 . GL_LIGHT0 , GL2 . GL_POSITION , fLightPos . mirrorY (). toArray () , 0);// Desenhar a reflexao do Torusgl. glPushMatrix ();// Ao utiliza y=-1 estamos a inverter a imagemgl. glScalef (1f, -1f, 1f);gl. glFrontFace ( GL2 . GL_CW ); // Estamos InvertidosdrawWorld (gl );gl. glFrontFace ( GL2 . GL_CCW ); // Reporgl. glPopMatrix ();// Desenhar o Nosso chao , mas agora transparentegl. glDisable ( GL2 . GL_LIGHTING );gl. glEnable ( GL2 . GL_BLEND );gl. glBlendFunc ( GL2 . GL_SRC_ALPHA , GL2 . GL_ONE_MINUS_SRC_ALPHA );gl. glColor4f (.5f, .5f, .5f, .5f);GlUtil . drawGround ( FloorSize , 1f);60