Come rendere parzialmente trasparente una trama?


13

Buongiorno StackOverflow, sto avendo un po 'di problemi in questo momento in quanto non riesco a trovare un modo per rendere parte di una trama in modo trasparente con openGL.

Ecco la mia impostazione: ho un quadruplo, che rappresenta un muro, coperto da questa trama (convertito in PNG a scopo di caricamento). Ovviamente, voglio che il muro sia opaco, ad eccezione dei vetri. C'è un altro aereo dietro il muro che dovrebbe mostrare un paesaggio. Voglio vedere il paesaggio da dietro la finestra. Ogni trama è una TGA con canale alfa.

Il "paesaggio" è reso prima, poi il muro. Ho pensato che sarebbe stato sufficiente ottenere questo effetto, ma a quanto pare non è così. La parte della finestra che dovrebbe essere trasparente è nera e il paesaggio appare solo quando passo oltre il muro.

Ho provato a giocherellare con GLBlendFunc () dopo averlo abilitato ma non sembra fare il trucco.

Sto dimenticando un passo importante?

Grazie :)


Ciao, benvenuto su gdse. Ho fatto una piccola modifica, non ci piace inserire i tag in domande molto dirette (specialmente quando lo stesso tag viene utilizzato nei tag :)). E alla tua domanda. Stai usando una pipeline fissa o i tuoi shader?
Notabene,

Grazie per la modifica. Non sono sicuro del significato di "pipeline fissa" ma costruisco manualmente ogni vertice e non uso alcun shader. Se questo è importante, non sto usando l'ultima versione di openGL in quanto è per un incarico scolastico (penso che sia openGL 3).
Megamoustache,

Sarebbe bello se potessi includere l'immagine nella tua domanda. Sembra essere scomparso dalla sua posizione originale.
OR Mapper

Risposte:


19

Oltre a tutto ciò che hai dichiarato (trame con canali alfa, disegno del paesaggio prima di disegnare il muro + finestra), devi anche fare altre due cose.

Innanzitutto, devi abilitare la funzionalità di fusione di OpenGL:

glEnable(GL_BLEND);

In secondo luogo, devi dire a OpenGL come calcolare i colori dei pixel misti (che OpenGL chiama "frammenti", per inciso). In questo caso, starai bene con qualcosa di semplice come questo:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Una volta attivata la fusione, OpenGL combinerà i colori dei pixel in base ai parametri delle funzioni fornite in glBlendFunc. In particolare, eseguirà "source.color * source.alpha + destination.color * (1-source.alpha)", dove "source" è la trama che stai visualizzando e "destinazione" è il colore già presente nella framebuffer (il paesaggio). Quindi, ovunque il tuo canale alfa sia bianco, otterrai il colore della parete e ovunque il canale alfa sia nero, otterrai il colore del paesaggio. Se il canale alfa è grigio, otterrai una dissolvenza incrociata tra i due colori.

Se la tua finestra è completamente trasparente, allora ci sono altri modi per farlo, in cui l'ordine in cui disegni i due poligoni non è importante, ma questo inizia a entrare in concetti più avanzati come le soglie alfa. Probabilmente non necessario per la tua situazione attuale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.