2010-09-23 20 views
7

Je ne sais pas si c'est possible, mais ça vaut le coup. J'utilise le tampon de pochoir pour réduire Overdraw pour des volumes légers dans un moteur de rendu différé en utilisant cet algorithme (lorsque l'appareil est en dehors du volume):tampon OpenGL stencil OU opération?

  1. En utilisant un shader pas cher, dessiner faces arrière avec le test de profondeur mis à LEQUAL , en les marquant dans le tampon stencil. En utilisant le shader d'éclairage coûteux, dessinez les faces avant avec un test de profondeur réglé sur GEQUAL.

Cela entraînera l'ombrage uniquement des pixels dans le volume de lumière. Le problème avec ceci vient quand dessiner plusieurs lumières. Tout d'abord, puisque les changements d'état sont coûteux, ce n'est probablement pas la meilleure idée de basculer à plusieurs reprises entre le shader bon marché et cher pour chaque lumière. Idéalement, je voudrais profiter de tous les 8 bits de la mémoire tampon du pochoir en rendant 8 volumes légers avec le shader bon marché suivi de 8 volumes légers avec le shader cher. Cependant, des problèmes surviennent lorsque les lumières se chevauchent, car il n'y a aucun moyen de savoir quels pixels appartiennent à quelles lumières.

La solution qui vient à l'esprit serait d'utiliser 1 bit dans le tampon stencil par lumière. Ainsi, pour la lumière n, marquez le n bit dans le tampon stencil dans la passe bon marché, puis seulement rendre les pixels avec ce bit pendant la passe coûteuse.

Je n'ai pas utilisé le tampon stencil auparavant, mais d'après ce que je lis cela ne semble pas possible. Pour que cela fonctionne, je devrais définir le tampon de stencil en utilisant OR au niveau du bit et la fonction de stencil devrait être au format AND. Cependant, les seules opérations sur le tampon de stencil que je peux voir sont: KEEP, ZERO, REPLACE, INCR, DECR, et INVERT, et les seules fonctions sont: JAMAIS, TOUJOURS, MOINS, ÉGAL, LEQUAL, GEQUAL, PLUS GRAND et NOTEQUAL.

Y at-il un moyen d'obtenir en quelque sorte ce comportement OR et AND en utilisant le tampon stencil? Et sinon, existe-t-il une approche alternative pour rendre efficacement les volumes de lumière?

Répondre

6

Pour obtenir le comportement de mise à jour ORing, utilisez glStencilMask combiné avec GL_REPLACE. Pour obtenir un comportement de test AND, utilisez le paramètre glStencilFuncmask associé à GL_EQUAL. Dans les deux cas, vous voulez que le paramètre ref à glStencilFunc soit 0xff.

+0

IMPRESSIONNANT! Ceci est exactement ce que je cherchais. Merci beaucoup! – Gumgo