2009-09-13 9 views
0

Je suis un peu nouveau sur OpenGL. Je l'ai utilisé pour des choses extrêmement simples comme le rendu de textures (2D) et de transformations de base MODELVIEW, mais maintenant je veux modifier les valeurs alpha à la mode similaire à la pile MODELVIEW.OpenGL Alpha Stack

J'ai fondamentalement une classe glTex, qui restitue une texture à un certain point après l'application de certaines transformations. (Traduction, Rotation, Alpha.) Maintenant, cela fonctionne bien pour des choses simples comme des images simples, mais si je veux dessiner quelque chose d'un peu plus complexe, disons une simple grille. Je traduirais à la position requise de la grille, et ensuite dessiner chaque partie de celui-ci. Cela fonctionne bien car j'appelle généralement glPushMatrix() et glPopMatrix() avant et après le rendu d'une texture.

Le problème se pose lorsque je veux contrôler le alhpa de la grille. Supposons que je veux le rendre à 0,50 alpha. Je pourrais passer en revue chacun de ses composants et changer leurs valeurs alpha, mais cela signifie que si certaines parties de la grille sont faites de plus petites parties, elles devraient faire de même ou si les petites parties elles-mêmes avaient des valeurs alpha je le ferais avoir à calculer une toute nouvelle alpha, ce qui se transforme en un processus très long.

Y a-t-il un moyen d'obtenir une pile alpha comme celle de MODELVIEW? Ou y a-t-il une meilleure façon de s'y prendre?

Exemple - La grille est rendue à 0,5 alpha. Si elle a un composant qui est normalement rendu à 0,25 alpha, il sera maintenant rendu à .125 alpha

Btw, j'ai le glBlendFunc mis à GL _SRC _ALPHA et GL _ONE _MINUS _SRC _ALPHA.

Répondre

3

Il n'y a pas moyen de multiplier une alpha supplémentaire dans l'alpha actuelle comme vous pouvez modifier les matrices de transformation en OpenGL, OpenGL n'a pas d'état « alpha ». les valeurs alpha sont transmises à côté des informations de couleur. Donc ce que vous voulez faire est d'écrire une petite classe d'aide qui garde la trace de vos états alpha:

Entrez le code ici

#define ALPHA_STACK_SIZE 10 

class CAlphaState { 
private: 
    float m_alphaStack [ALPHA_STACK_SIZE]; 
    int m_tos; 
public: 
    CAlphaState() : m_tos (-1) { } 
    inline float Push (float alpha) { 
     if (m_tos >= 0) 
     alpha *= m_alphaStack [m_tos]; 
     if (m_tos < ALPHA_STACK_SIZE - 1) // TODO: Add dynamic stack size handling 
     m_alphaStack [++m_tos] = alpha; 
     return alpha; 
     } 
    inline void Pop (void) { if (m_tos >= 0) m_tos--; } 
    inline void Get (void) { return (m_tos < 0) ? 1.0f : m_alphaStack [m_tos]; } 
    inline void Set (float alpha) { glColor4f (1.0f, 1.0f, 1.0f, Push (alpha)); } 
    }; 

La restriction de cette classe est qu'il met toujours votre tirage couleur au blanc . Vous pouvez ajouter un livre de couleur à la classe ou utiliser la fonction Get pour définir la couleur en utilisant l'alpha actuel après l'avoir poussé.

+0

Pas exactement ce que je cherchais, mais aussi près que possible, je suppose. Merci :) –

+0

Je sais, mais il n'y a pas d'autre moyen de le faire que de le coder soi-même. – karx11erx