Como tornar uma textura parcialmente transparente?

13

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 :)

megamoustache
fonte
Olá, bem-vindo ao gdse. Fiz pouca edição, não gostamos de colocar tags em perguntas com muito título (especialmente quando você usa as mesmas tags nas tags :)). E a sua pergunta. Você está usando pipeline fixo ou seus próprios shaders?
Notabene
Obrigado pela edição. Não tenho certeza do significado de "pipeline fixo", mas construo todos os vértices manualmente e não uso nenhum sombreador. Se isso importa, não estou usando a última versão do openGL, pois é para um trabalho escolar (acho que é o openGL 3).
megamoustache
Seria ótimo se você pudesse incluir a imagem em sua pergunta. Parece ter desaparecido de sua localização original.
OR Mapper

Respostas:

19

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:

glEnable(GL_BLEND);

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:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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.

Trevor Powell
fonte