¿Cómo hacer una textura parcialmente transparente?


13

Good Morning StackOverflow, estoy teniendo un pequeño problema en este momento, ya que parece que no puedo encontrar una manera de representar parte de una textura de forma transparente con openGL.

Aquí está mi configuración: tengo un quad, que representa una pared, cubierto con esta textura (convertido a PNG para cargarlo). Obviamente, quiero que la pared sea opaca, a excepción de los paneles de vidrio. Hay otro avión detrás de la pared que se supone que muestra un paisaje. Quiero ver el paisaje desde detrás de la ventana. Cada textura es un TGA con canal alfa.

Primero se representa el "paisaje", luego el muro. Pensé que sería suficiente para lograr este efecto, pero aparentemente no es el caso. La parte de la ventana que se supone que es transparente es negra y el paisaje solo aparece cuando paso la pared.

Traté de jugar con GLBlendFunc () después de haberlo habilitado, pero parece que no funciona.

¿Estoy olvidando un paso importante?

Gracias :)


Hola, bienvenido a gdse. Hice una pequeña edición, no nos gusta colocar etiquetas en el encabezado de las preguntas (especialmente cuando usas la misma etiqueta en las etiquetas :)). Y a tu pregunta. ¿Está utilizando una tubería fija o sus propios sombreadores?
Notabene

Gracias por la edición No estoy seguro del significado de "tubería fija" pero construyo cada vértice manualmente y no uso ningún sombreador. Si eso importa, no estoy usando la última versión de openGL, ya que es para una asignación escolar (creo que es openGL 3).
megamoustache

Sería genial si pudiera incluir la imagen en su pregunta. Parece haber desaparecido de su ubicación original.
O Mapper

Respuestas:


19

Además de todo lo que ha indicado (texturas con canales alfa, dibujar el paisaje antes de dibujar la pared + ventana), también debe hacer dos cosas más.

Primero, debe habilitar la funcionalidad de fusión de OpenGL:

glEnable(GL_BLEND);

En segundo lugar, debe decirle a OpenGL cómo calcular los colores de los píxeles mezclados (que OpenGL llama "fragmentos", por cierto). En este caso, estarás bien con algo simple como esto:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Una vez que se activa la fusión, OpenGL combinará los colores de los píxeles de acuerdo con los parámetros de función que le dé en glBlendFunc. Específicamente, hará "source.color * source.alpha + destination.color * (1-source.alpha)", donde "source" es la textura que está renderizando actualmente, y "destination" es el color que ya está en el framebuffer (el paisaje). Entonces, donde sea que su canal alfa sea blanco, obtendrá el color de la pared, y donde sea que el canal alfa sea negro, obtendrá el color del paisaje. Si el canal alfa es gris, obtendrá un fundido cruzado entre los dos colores.

Si su ventana es completamente transparente, entonces hay otras formas de hacerlo, donde el orden en el que dibuja los dos polígonos no es importante, pero eso comienza a entrar en conceptos más avanzados, como los umbrales alfa. Probablemente no sea necesario para su situación actual.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.