OpenGL Blend Modes vs Shader Blending

je suis en train de faire quelques recherches sur OpenGL et Shaders mais je n'arrive pas à comprendre s'il y a des différences fondamentales entre le mélange en utilisant le glBlendMode ou en écrivant vos propres modes de mélange dans un shader.

Quelles sont les raisons de choisir l'un ou l'autre? Existe-il des goulots d'étranglement des performances en choisissant l'un sur l'autre? Ou est-ce juste une question de préférence personnelle?

11
demandé sur genpfault 2012-07-24 19:14:47

4 réponses

le mélange traditionnel avec glBlendFunc ne peut pas être répliqué dans un shader. Le mélange nécessite d'échantillonner le framebuffer de destination avant de le modifier, ce qui n'est pas quelque chose qui peut être fait sur le matériel courant.

Actuellement, vous ne pouvez passer le long d'une couleur, et de choisir l'un d'une sélection limitée de modes de mélange (glBlendFunc/glBlendEquation) qui sera appliquée par le rasterizer GPU avant d'écrire à framebuffer.

13
répondu Tim 2012-07-24 16:06:59

Lorsqu'un shader lit à partir d'une texture alors que celle-ci est rendue simultanément à la même texture, les résultats ne sont pas définis. C'est pourquoi le mélange de fonctionnalités" traditionnelles " ou fixes avec glBlendFunc et glBlendEquation est utile.

pour mélanger deux images en utilisant le mélange traditionnel, vous rendez la première image, Définissez le mode de mélange, la fonction et l'équation, et rendez la deuxième image. Ceci est garanti pour donner des résultats corrects, et est généralement le moyen le plus rapide pour obtenir des effets comme la transparence.

pour obtenir le même effet avec un shader, vous devez rendre la première image à une texture auxiliaire, changer les shaders, et rendre la deuxième image au framebuffer réel, faisant le mélange comme une étape finale dans le shader de fragment. Cela est généralement plus lent en raison de la hauteur supplémentaire des lectures de texture, et va certainement utiliser plus de mémoire GPU pour la texture auxiliaire.

Sur le matériel moderne, la différence entre les deux techniques tend à être petit.

6
répondu Brian Johnson 2013-07-16 01:20:06

il est possible de simuler OpenGL blending à partir d'un shader dans trois circonstances que je connais:

  1. vous avez Direct3D11 ou L'équivalent OpenGL, et vous liez la cible de rendu comme une texture de lecture-écriture dans votre pixel shader. Cela permet des opérations de mélange arbitrairement complexes, mais n'aura pas de hautes performances lors d'un mélange simple, parce que vous contournez le matériel spécial de votre GPU pour un mélange simple.

  2. vous avez un GPU exotique " à base de tuiles "où même le mélange simple est fait par un" alpha shader."Dans ce cas, il n'y a pas de différence de performance entre un simple mélange dans OpenGL et un code shader équivalent. Mais il est peu probable que vous ayez un tel GPU, et OpenGL n'expose pas cette fonctionnalité de toute façon.

  3. vous contournez l'ensemble du pipeline de rastérisation du matériel à fonction fixe, et vous écrivez le vôtre comme un complexe de "shaders de calcul"."Si tu peux faire ça, quelque chose comme un alpha" shader " ferait partie de votre pipeline à base de tuiles, mais arriver à ce point est tellement de travail que alpha blending serait le moindre de vos soucis.

1
répondu bmcnett 2012-07-24 16:37:14

ceci peut en fait être accompli en utilisant l'extension gl 3.0 en utilisant la fonction de barrière de texture:

http://www.opengl.org/registry/specs/NV/texture_barrier.txt

fondamentalement, après avoir écrit l'arrière-plan, vous pouvez la fonction TextureBarrierNV () pour être sûr que les texels sont rincés, alors vous pouvez effectuer une opération de lecture/écriture dans une étape de shader simple (assurez-vous d'éviter les buffers multisampling parce qu'une seule opération d'écriture est en fait permettre.).

0
répondu Leonardo Bernardini 2014-04-27 13:19:47