Pregunta

Con suerte, esta es una pregunta simple: tengo una textura OpenGL y me gustaría poder cambiar su opacidad, ¿cómo hago eso? La textura ya tiene un canal alfa y la fusión funciona bien, pero quiero poder disminuir la opacidad de toda la textura, para desvanecerla en el fondo. He jugado con glBlendFunc , pero sin suerte & # 8211; parece que necesitaría algo como GL_SRC_ALPHA_MINUS_CONSTANT , que no está disponible. Estoy trabajando en iPhone, con OpenGL ES.

¿Fue útil?

Solución 3

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

Otros consejos

No tengo idea acerca de OpenGL ES, pero en OpenGL estándar establecerías la opacidad declarando 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 su textura. Al ajustar los otros valores, también puede cambiar el color de la textura.

Use un combinador de texturas. Establezca la etapa de textura para realizar una operación GL_MODULATE entre una textura y un color constante. Luego 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 (si no todas) las operaciones del combinador de chips gráficos toman el mismo número de ciclos de GPU (generalmente 1), por lo que simplemente usar una textura en lugar de realizar una operación de modulación (o cualquier otra operación) es exactamente el mismo costo.

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

La forma más directa es cambiar el valor alfa de la textura sobre la marcha. Como en algún momento le cuentas a OpenGL sobre la textura, tendrás el mapa de bits en la memoria. Así que simplemente vuelva a unir la textura a la misma identificación 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, utilizando glGetTexImage () . Esa es la solución limpia.

Sin embargo, las operaciones de guardar / recuperar son un poco costosas, por lo que es posible que desee otra solución. Pensando 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. Probablemente desee tener una combinación 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.

Lo más probable es que esté usando cg para obtener su imagen en una textura. Cuando usa cg, el alfa se premultiplica, por lo que debe usar el alfa para rgba de la función color4f.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top