2017-02-20 2 views
1

Dans Open GL, est-il possible de rendre un polygone avec un test de profondeur régulier activé, mais lorsque la valeur du tampon de profondeur est réellement écrite dans le tampon de profondeur, je veux écrire une valeur personnalisée? La raison en est que je suis en train de rendre un système de particules qui devrait être testé en profondeur par rapport à la géométrie de la scène, mais je veux écrire une très grande valeur de profondeur où se trouve le système de particules. -blur étape de post-traitement pour brouiller davantage le système de particules)Comment puis-je écrire une valeur différente du tampon de profondeur que la valeur utilisée pour la comparaison de profondeur?

Mise à jour pour affiner encore la question, est-il possible sans rendre en plusieurs passes?

+1

Si la question est "est-ce possible" alors la réponse est oui. Rendez votre scène dans un FBO, utilisez sa profondeur de la pièce jointe pour faire un test de profondeur "manuel" dans votre fragment shader ("éliminer les fragments qui échoueront au test de profondeur) et afficher une valeur arbitraire de profondeur dans un autre tampon de profondeur". initialisé par blitting de la FBO, si vous voulez). Aucune garantie sur les performances de tout cela ... – peppe

+0

Merci mis à jour la question. –

+0

Je n'ai jamais utilisé ARB_conservative_depth, mais cela pourrait résoudre votre problème. – pleluron

Répondre

3

Vous n'avez pas.

OpenGL ne vous permet pas de d'être. Le test de profondeur teste la valeur dans le tampon de profondeur par rapport à la valeur entrante à écrire dans le tampon de profondeur. Une fois ce test réussi, la valeur de profondeur testée sera écrite dans le tampon de profondeur. Période.

Vous ne pouvez pas (ab) utiliser le test de profondeur pour faire autre chose que tester des valeurs de profondeur.

ARB_conservative_depth/GL 4.2 ne vous permet un très limitée de ce. Fondamentalement, vous promettez la mise en œuvre que vous ne modifiez la profondeur que d'une manière qui la rend plus petite ou plus grande que la valeur d'origine. Mais même dans ce cas, cela ne fonctionnerait que dans des cas spécifiques, et seulement si vous restez dans les limites que vous avez spécifiées.

L'exécution de early fragment tests ne vous permettra pas non plus de le faire. La spécification indique explicitement que la profondeur sera écrite avant votre shader s'exécute. Donc tout ce que vous écrivez à gl_FragDepth sera ignoré.

+0

Merci, la profondeur fondamentalement conservatrice m'aurait aidé, mais comme je suis opengl es 3.0 je vais juste devoir repenser mon algorithme –

0

Vous pouvez utiliser gl_FragDepth dans fragment shader pour écrire vos valeurs personnalisées.

gl_FragDepth = 0.3; 

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml

+3

Si vous écrivez dans gl_FragDepth, cette valeur sera également utilisée pour effectuer la comparaison de profondeur. La question demande explicitement un moyen de modifier la profondeur écrite, mais pas le test de profondeur lui-même. Afaik, il n'est pas possible d'utiliser des valeurs différentes pour tester et écrire à moins de rendre deux fois la géométrie. – BDL