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
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é).
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.
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.
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
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.
Hmm .. una solución muy elegante + simple, NeARAZ. – mstrobl
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.
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.
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).
- 1. Voltear la textura OpenGL
- 2. Cómo cambiar el texel individual en la textura OpenGL
- 3. La textura OpenGL no sigue la geometría
- 4. Cambiar la opacidad de la imagen
- 5. Cambiar la Opacidad de TextView en Android
- 6. Convertir la textura OpenGL a OpenCV Mat
- 7. Textura translúcida OpenGL sobre otra textura
- 8. Android opengl textura corrupción
- 9. OpenGL textura invertida
- 10. Proyectar una textura en OpenGL
- 11. Textura OpenGL Cargando
- 12. OpenGL y textura monocromática
- 13. OpenGL ES: Cómo teñir la textura con el color
- 14. OpenGL - Interpretación en una textura
- 15. ¿Cómo configuro la opacidad de un vértice en OpenGL?
- 16. OpenGL ES 1.1: ¿Cómo cambiar el color de la textura sin perder la luminancia?
- 17. Renderice la superficie de cairo directamente a la textura OpenGL
- 18. Cambiar la opacidad del fondo sin cambiar la opacidad del contenido
- 19. int matriz para la textura de OpenGL en Android
- 20. three.js - ¿Cómo puedo cambiar dinámicamente la opacidad del objeto?
- 21. cómo administrar la memoria con textura en OpenGL?
- 22. OpenGL ES no borrará mi textura en la memoria
- 23. Coordenadas de textura OpenGL en Pixel Space
- 24. textura de JuicyPixels cargando en Haskell OpenGL?
- 25. Android OpenGL - ES Textura sangrando
- 26. Opengl Geometry shader La búsqueda de textura de entero falla
- 27. Cambiar la opacidad de la imagen de fondo
- 28. cambiar la opacidad de la imagen usando javascript
- 29. Cambiar opacidad div en desplazamiento
- 30. Textura transparente en OpenGL ES para Android
¿Y esto le hizo decidir marcar su propia "respuesta" como la respuesta aceptada? – zmippie
Sí, ya que resolvió el problema que tenía. No dude en estar en desacuerdo :) – zoul
Está configurando algo mal con las texturas. Lo que Dan respondió funciona y tiene sentido, tu 'solución' es un truco. – cjcela