2009-08-23 8 views
2

Ceci est lié à mon dernier question. Pour obtenir cette image:Problème de fusion d'images lors du rendu à la texture

http://img252.imageshack.us/img252/623/picture8z.png

  1. Je dessine un fond blanc (couleur = (1, 1, 1, 1)).

  2. je rendre à texture les deux carrés supérieur gauche avec la couleur = (1, 0, 0, .8) et mélanger fonction (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), puis dessiner la texture avec la couleur = (1, 1, 1, 1) et mélanger fonction (GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

  3. Je dessine le carré inférieur droit avec la couleur = (1, 0, 0, .8) et la fonction de fusion (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

D'après mes calculs, devraient avoir la couleur

.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64) 

les carrés à texture rendre et ainsi après avoir dessiné cette texture sur le fond blanc, ils devraient avoir la couleur

(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

et le carré en bas à droite doit avoir la couleur

.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

qui devrait se ressembler! Mon raisonnement est-il faux? Mon calcul est-il faux?

Dans tous les cas, mon but est de mettre en cache une partie de ma scène. Comment puis-je rendre-à-texture, puis dessiner cette texture de sorte qu'il équivaut à dessiner la scène en ligne?

Répondre

4

Si vous voulez rendre un contenu mélangé à une texture et que cette texture est composée à l'écran, le moyen le plus simple est d'utiliser l'alpha prémultiplié partout. Il est relativement simple de montrer que cela fonctionne pour votre cas: la couleur de vos carrés semi-transparents sous forme prémultipliée est (0.8, 0, 0, 0.8), et la fusionner avec (0, 0, 0, 0) avec (GL_ONE , GL_ONE_MINUS_SRC_ALPHA) passe essentiellement la couleur de vos carrés à travers la texture. Le mélange (0,8, 0, 0, 0,8) sur du blanc opaque avec (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) vous donne (1,0, 0,2, 0,2, 1,0). Notez que les canaux de couleur sont les mêmes que votre troisième calcul, mais le canal alpha est toujours 1.0, ce qui est ce que vous attendez d'un objet opaque recouvert par un objet fusionné.

Tom Forsyth a un bon article sur alpha précultiplié. Le tout vaut la peine d'être lu, mais voir la section "Compositing translucent layers" pour une explication de la raison pour laquelle les maths fonctionnent dans le cas général.

0

Oups, mon calcul est faux! la deuxième ligne devrait être

(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84) 

qui semble bien correspondre à ce que je vois (quand je change le dernier carré à la couleur (1, .2, .2, .8), les trois carrés apparaissent de la même couleur).

0

Concernant votre dernière question: Remplacer des parties de la scène par des textures n'est pas trivial. Un bon point de départ est PhD thesis de Stefan Jeschke.

Questions connexes