iphone - texture - texturas multiples opengl
Cambiar la opacidad de la textura en OpenGL (7)
La forma 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 limitaciones de espacio, ya que está en ES), puede recuperar la textura en un búfer de nuevo, utilizando glGetTexImage () . Esa es la solución limpia.
Sin embargo, 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. Usando un glBlendFunc de
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),
es posible que pueda "fácilmente" y, lo que es más importante, a bajo costo, lograr el efecto deseado.
Esta es, con suerte, 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 glBlendFunc
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.
No tengo idea acerca de OpenGL ES, pero en OpenGL estándar establecería 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 te da 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.
Usa 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.
Lo más probable es que estés usando cg para obtener tu imagen en una textura. Cuando usas cg, el alfa se premultiplica, por lo que tienes que usar el alfa para rgba del func color4f.
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 de texturación (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é).
Sospecho que tenías un fondo negro, y por lo tanto al disminuir la cantidad de cada color, estabas efectivamente desvaneciendo el color a negro.
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).