2009-05-03 5 views
16

Je dois imiter les modes de fusion Photoshop ("multiplier", "écran", etc.) dans mon code OpenGL ES 1.1 (sans shaders).Photoshop mode de mélange à OpenGL ES sans shaders

Il y a quelques documents sur la façon de le faire avec HLSL:

J'ai besoin au moins de travailler en mode écran.

Y a-t-il des implémentations sur le pipeline fixe que je peux regarder?

+1

[This] (http://www.pegtop.net/delphi/articles/blendmodes/) page a beaucoup de détails sur la façon dont fonctionne chaque mode de fusion (avec des diagrammes) – bobobobo

Répondre

15

La plupart des modes de mélange photoshop sont basés sur les modes de fusion Porter-Duff.

Ceci nécessite que toutes vos images (textures, rendus) soient dans un espace couleur prémultiplié. Cela se fait généralement en multipliant toutes les valeurs de pixel par la valeur alpha avant de les stocker dans une texture. Par exemple. un pixel entièrement transparent ressemblera à du noir dans un espace colorimétrique non prémultiplié. Si vous n'êtes pas familier avec cet espace de couleur, passez une heure ou deux à lire à ce sujet sur le Web. C'est un concept soigné et bon et requis pour les compositions photoshop.

Quoi qu'il en soit - une fois que vous avez vos images dans ce format, vous pouvez activer l'écran en utilisant:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR) 

Le mode MULTIPLIER complet est impossible avec l'OpenGL | ES pipeline. Si vous ne travaillez avec pixels opaques, vous pouvez truquer utiliser:

glBlendFunc(GL_ZERO, GL_SRC_COLOR) 

Les résultats pour les pixels transparents, soit dans votre texture et votre framebuffer aurez tort cependant.

1

Le meilleur endroit pour commencer est de prendre une copie du Red Book et de lire les chapitres sur les matériaux et les modes de fusion. Il a une explication très complète et claire du fonctionnement des fonctions de mélange OpenGL 'classiques'.

10

vous devriez essayer ceci:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) 

Cela ressemble multiplicatifs à moi sur l'iPhone/OpenGL ES

+1

Merci pour la bonne réponse, ressemble exactement à multiplier dans photoshop (: –

+0

Cela ne fonctionne que si l'image est une couleur unie (opaque) .Si vous avez une image avec la transparence, vous devez simplement la mettre en face d'un fond blanc, puis essayez ceci. – Peter

1

J'ai trouvé que l'utilisation de ceci:

glDepthFun(GL_LEQUAL);

était besoin d'obtenir un effet d'écran, au moins cela a bien fonctionné sur mon projet.

Je ne sais pas pourquoi cela fonctionne, mais si quelqu'un sait s'il vous plaît partager.