2008-11-03 20 views
11

Espero que esta sea una pregunta simple: tengo una textura OpenGL y me gustaría poder cambiar su opacidad, ¿cómo puedo hacer eso? La textura ya tiene un canal alfa y la mezcla funciona bien, pero quiero poder disminuir la opacidad de toda la textura para fundirla en segundo plano. He jugueteado con glBlendFunc, pero sin suerte, parece que necesitaría algo como GL_SRC_ALPHA_MINUS_CONSTANT, que no está disponible. Estoy trabajando en iPhone, con OpenGL ES.Cambiar la opacidad de la textura en OpenGL

Respuesta

2

Gracias a todos por las ideas. He jugado tanto con glColor4f como con glTexEnv y finalmente me obligué a leer cuidadosamente la página de manual de glTexEnv. La página de manual dice que en el modo de texturización GL_MODULATE, el color resultante se calcula multiplicando el fragmento entrante por el color texturizado (C = Cf × Ct), lo mismo ocurre con el alfa. Probé glColor4f (1, 1, 1, opacidad) y eso no funcionó, pero pasar la opacidad deseada en los cuatro argumentos de la llamada hizo el truco. (Todavía no estoy seguro de por qué).

+2

¿Y esto le hizo decidir marcar su propia "respuesta" como la respuesta aceptada? – zmippie

+0

Sí, ya que resolvió el problema que tenía. No dude en estar en desacuerdo :) – zoul

+0

Está configurando algo mal con las texturas. Lo que Dan respondió funciona y tiene sentido, tu 'solución' es un truco. – cjcela

16

que no tienen ni idea acerca de OpenGL ES, pero en OpenGL estándar se debe establecer la opacidad al declarar un color para la textura antes de usarla:

//   R, G, B, A 
glColor4f(1.0, 1.0, 1.0, 0.5); 

El ejemplo le daría un 50% de alfa sin afectar el color de tu textura Al ajustar los otros valores, puede cambiar el color de la textura también.

+0

¿Con qué tipo de configuración para glBlendFunc? – zoul

+2

Bueno, esto depende de la aplicación, pero normalmente usaría: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); – Dan

+3

Esto funciona porque el entorno de textura predeterminado está configurado en GL_MODULATE – noop

1

La manera más directa es cambiar el valor alfa de la textura sobre la marcha. Como le dice a OpenGL sobre la textura en algún momento, tendrá el mapa de bits en la memoria. Así que simplemente vuelva a enlazar la textura con la misma ID de textura. En caso de que no lo tenga en la memoria, (debido a restricciones de espacio, ya que está en ES), puede recuperar la textura en un búfer nuevamente, usando glGetTexImage(). Esa es la solución limpia.

Las operaciones de guardado/recuperación son un poco costosas, por lo que es posible que desee otra solución. Al pensar en ello, es posible que pueda trabajar con la geometría detrás de la geometría que muestra su textura o simplemente trabajar en el material/color de la geometría que contiene la textura. Es probable que desee tener una mezcla aditiva de la geometría posterior. El uso de un glBlendFunc de

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA), 

que podría ser capaz de "fácil" y - más importante, barato - conseguir el efecto deseado.

+0

Una textur se usa generalmente para varios objetos, cambiarla cambiaría la transparencia de todos los objetos. Además, en muchos sistemas, las cargas de textura son mucho más lentas que una simple operación de copia debido a las conversiones de formato internas. – noop

7

Use un combinador de texturas. Establezca la etapa de textura para realizar una operación GL_MODULATE entre una textura y un color constante. A continuación, cambie el color constante de su código (glTexEnv, GL_TEXTURE_ENV_COLOR).

Esto debería venir como "gratis" en términos de rendimiento. En la mayoría de los chips de gráficos (si no en todos) las operaciones combinatorias toman el mismo número de ciclos de GPU (generalmente 1), por lo que simplemente usar una textura versus hacer una operación de modulación (o cualquier otra operación) es exactamente el mismo costo.

+0

Hmm .. una solución muy elegante + simple, NeARAZ. – mstrobl

1

Lo más probable es que esté utilizando cg para obtener su imagen en una textura. Cuando usas cg, el alfa se premultiplica, por lo que tienes que usar el alfa para rgba del funcion color4f.

0

Sospecho que tenías un fondo negro, y por lo tanto, al disminuir la cantidad de cada color, efectivamente estabas descolorando el color a negro.

2

Básicamente tiene dos opciones: use glTexEnv para su textura con GL_MODULATE y especifique el color usando glColor4 * y use un nivel no opaco para el canal alfa. Tenga en cuenta que glTexEnv debe emitirse solo una vez, cuando primero carga su textura. Sin embargo, este escenario no funcionará si especifica colores en sus atributos de vértice.Esos, a saber, anularán cualquier color glColor4 * que pueda establecer. En ese caso, es posible que desee recurrir a cualquiera de las 2 opciones: utilizar combinadores de texturas (tema avanzado, no es agradable usarlos en tuberías fijas) o "manualmente" cambiar el atributo de color de vértices de cada vértice individual (puede no ser deseable para mallas más grandes).

Cuestiones relacionadas