Bom dia StackOverflow, estou com um problema agora, pois não consigo encontrar uma maneira de renderizar parte de uma textura de forma transparente com o openGL.
Aqui está a minha configuração: Eu tenho um quad, representando uma parede, coberto com essa textura (convertido em PNG para fins de upload). Obviamente, quero que a parede seja opaca, exceto pelos vidros. Há outro avião atrás do muro que deve mostrar uma paisagem. Eu quero ver a paisagem por trás da janela. Cada textura é um TGA com canal alfa.
A "paisagem" é renderizada primeiro, depois a parede. Eu pensei que seria suficiente para alcançar esse efeito, mas aparentemente não é o caso. A parte da janela que deveria ser transparente é preta e a paisagem só aparece quando passo pela parede.
Tentei mexer no GLBlendFunc () depois de ativá-lo, mas ele não parece funcionar.
Estou esquecendo um passo importante?
Obrigado :)
fonte
Respostas:
Além de tudo o que você declarou (texturas com canais alfa, desenhando a paisagem antes de desenhar a parede + a janela), você também precisa fazer mais duas coisas.
Primeiro, você precisa habilitar a funcionalidade de mesclagem do OpenGL:
Segundo, você precisa informar ao OpenGL como calcular as cores dos pixels combinados (que o OpenGL chama de "fragmentos", aliás). Nesse caso, você ficará bem com algo simples como este:
Depois que a mesclagem é ativada, o OpenGL combina cores de pixel de acordo com os parâmetros de função fornecidos no glBlendFunc. Especificamente, ele fará "source.color * source.alpha + destination.color * (1-source.alpha)", onde "source" é a textura que você está processando no momento e "destination" é a cor já existente no framebuffer (a paisagem). Portanto, onde quer que o canal alfa seja branco, você terá a cor da parede e, onde o canal alfa for preto, a cor da paisagem. Se o canal alfa for cinza, você poderá obter um desbotamento cruzado entre as duas cores.
Se sua janela for totalmente transparente, existem outras maneiras de fazer isso, onde a ordem na qual você desenha os dois polígonos não é importante, mas isso começa a entrar em conceitos mais avançados, como limites alfa. Provavelmente não é necessário para a sua situação atual.
fonte