OpenGL Modes de Fusion vs Shader de Fusion
Je suis en train de faire quelques recherches sur l'OpenGL et les Shaders, mais je n'arrive pas à comprendre s'il y a des différences fondamentales entre le mélange à l'aide de la glBlendMode
ou l'écriture de vos propres modes de fusion 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?
OriginalL'auteur polyclick | 2012-07-24
Vous devez vous connecter pour publier un commentaire.
Traditionnel mélange avec glBlendFunc ne peuvent pas être reproduites dans un shader. Le mélange nécessite d'échantillonnage de la destination framebuffer avant de le modifier, ce qui n'est pas quelque chose qui peut être fait sur le matériel actuel.
Actuellement, vous ne pouvez passer le long d'une couleur, puis choisissez une sélection limitée de modes de fusion (glBlendFunc/glBlendEquation) qui sera appliquée par le GPU rasterizer avant d'écrire sur le framebuffer.
Non, vous pouvez toujours mélanger deux textures dans un shader, mais ce n'est pas ce mélange. Mélange mélange le pixel actuel avec le framebuffer. Vous pouvez toujours obtenir les mêmes effets par d'autres moyens (dessin à la texture et au mixage). @bartcla
Ok, donc si je comprends bien: mélange par la
glBlendFunc
est quelque chose de totalement différent de la fusion de textures dans un shader? Disons que j'ai envie de mélanger deux photos avec un "multiplier" mode de fusion. Cela devrait être fait dans un shader au lieu d'utiliser leglBlendFunc
? Pouvez-vous donner un exemple où laglBlendFunc
est-il utilisé?À vos deux premières questions, oui, c'est correct. Juste de l'échantillon les deux textures, et de multiplier les regrouper dans un shader. Le mélange est généralement utilisé plus de transparence, par exemple, si vous voulez dessiner une vitre teintée. C'est pour quand vous voulez dessiner quelque chose de transparent sur le dessus du reste de la scène qui a déjà été établi. @bartcla
OriginalL'auteur Tim
Lorsqu'un shader lit à partir d'une texture alors qu'il est simultanément le rendu de la texture, les résultats ne sont pas définis. C'est pourquoi le "traditionnel" ou fixes-la fonctionnalité de fusion avec glBlendFunc et glBlendEquation est utile.
De mélanger deux images à l'aide du traditionnel mélange, du rendu de la première image, réglez le mode de fusion, de fonction, et de l'équation, et le rendu de 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 tels que la transparence.
Pour obtenir le même effet avec un shader, vous avez besoin de rendre la première image d'un auxiliaire de la texture, de modifier les shaders, et le rendu de la deuxième image de la réelle framebuffer, faire le mélange comme une étape finale dans le fragment shader. C'est généralement plus lent en raison de la surcharge de texture lit, et va certainement utiliser plus de mémoire graphique pour l'auxiliaire de la texture.
Sur le matériel moderne, la différence entre les deux techniques est souvent de petite taille.
OriginalL'auteur Brian Johnson
Il est possible de simuler OpenGL mélange dans un shader dans trois circonstances, je suis conscient de:
Vous avez Direct3D11 ou OpenGL équivalent, et vous vous liez la cible de rendu en lecture-écriture de la texture à vos pixel shader. Cela permet arbitrairement complexes les opérations de mélange, mais n'auront pas de hautes performances quand faire simple mélange, parce que vous êtes en contournant le GPU du matériel spécial pour la simple fusion.
Vous avez un exotique "tuile" GPU où même un simple assemblage est fait par un "alpha shader." Dans ce cas, il n'y a pas de différence de performances entre un simple mélange en OpenGL et de l'équivalent du code du shader. Mais il est peu probable que vous avez un tel GPU, et OpenGL ne pas exposer cette fonctionnalité de toute façon.
Vous éluder le fixe en fonction du matériel de rastérisation pipeline, et écrire votre propre comme un complexe de "compute shaders." Si vous pouvez vous en sortir, quelque chose comme un "alpha shader" fera partie de votre carrelage à base de pipeline, mais arriver à ce point est beaucoup de travail que le mélange alpha serait le cadet de vos soucis.
un aspect intéressant de carrelage tramage est que, normalement, il n'existe pas de possibilité de conditions de concurrence entre les pixels. mais, si vous parliez au lieu de 1. alors oui vous avez raison: la garantie que le triangle tramage termine en série serait violé en l'espèce.
OriginalL'auteur bmcnett
Ce qui peut être fait en utilisant le gl 3.0 extension à l'aide de la texture de la fonction de barrière:
http://www.opengl.org/registry/specs/NV/texture_barrier.txt
En gros, après l'écriture d'arrière-plan, vous pouvez le TextureBarrierNV() pour être sûr de texels sont vidées, vous pouvez effectuer une opération de lecture/écriture dans un seul shader étape (assurez-vous d'éviter de multisampling tampons parce qu'une seule opération d'écriture est en effet autorisée)..
OriginalL'auteur Leonardo Bernardini