Assim, como OpenGL trata sempre sobre a imagem que JÁ FOI GERADA,
é importante que os objeto transparentes sejam EXIBIDOS DEPOIS
de todos os demais.
Quando for necessário desenhar um objeto quen não é
transparente deve-se desativar o BLEND:
glEnable(GL_BLEND);
glColor4f(1,1,1,alfa);
Este quarto parâmetro alfa pode variar entre 0 e 1, sendo 0 um objeto totalmente transparente e 1 um objeto opaco.
Esta função recebe dois parâmetro: o primeiro define o peso da cor do novo ponto e o segundo o peso da cor do ponto que já está na tela. Este pesos, em OpenGL, srão sempre uma função do nível de transparência do objeto, ou seja, de seu alfa.
Por exemplo, a chamada:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
define que a nova cor do ponto na tela será:
NovaCorNaTela = CorDoObjeto * AlfaDoObjeto + CorAntigaNaTele * (1-AlfaDoObjeto);
Neste caso, as contantes tem o seguinte sifnificado:
- GL_SRC_ALPHA: define que o peso da cor
do objeto que está sendo desenhado é o próprio alfa
de sua cor;
- GL_ONE_MINUS_SRC_ALPHA: define que o
peso da cor que já está na tela é de (1 - Alfa), onde
alfa é o nível de transparência do objeto que está
sendo desenhado.
// **********************************************************************
// void display( void )
// **********************************************************************
void display( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );// Desbilita o BLEND par ao primeiro objeto
glDisable(GL_BLEND);
glPushMatrix();
glTranslatef(0,0,-1);
glRotatef ( xrot, 1.0, 0.0, 0.0 );
glRotatef ( yrot, 0.0, 1.0, 0.0 );
glRotatef ( zrot, 0.0, 0.0, 1.0 );// habilita remoção de faces traseiras
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
DrawCube(0.5);
glPopMatrix();// Habilita o BLEND para ao segundo objeto
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// NovaCorNaTela = CorDoObjeto * AlfaDoObjeto + CorAntigaNaTele * (1-AlfaDoObjeto)
DesenhaVidro(AlfaVidro);
xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;
glutSwapBuffers();
}