Shader qui «coupe» le trou dans toute la géométrie

10

Comment puis-je créer un shader qui "coupe" à travers toute la géométrie, ne rendant que l'arrière-plan de compensation dans Unity? Un exemple:

entrez la description de l'image ici

C'est un prisme dans une immense pièce en forme de boîte blanche. La surface du prisme ne fait que rendre la skybox de la scène (un ciel étoilé). J'ai utilisé plusieurs caméras, ce qui est assez inefficace ... Il doit y avoir un moyen avec juste des shaders.

Comment puis-je faire ceci?

CalebHC
la source

Réponses:

14

Ok, enfin compris!

entrez la description de l'image ici

Vous voyez comment le maillage de la sphère «coupe» à travers le cylindre et plan jusqu'à la skybox. Cela m'a pris plus de temps que prévu pour comprendre cela, mais grâce à une page wiki ( http://wiki.unity3d.com/index.php/DepthMask ), j'ai tout trié.

Avant d'utiliser la configuration du shader dans la page wiki, j'utilisais trois caméras différentes avec des indicateurs de compensation / profondeur différents pour obtenir le même résultat. Cela a fonctionné, mais cela s'est complètement étouffé sur l'Ouya. La solution ci-dessus ne nécessite qu'un seul appareil photo et fonctionne beaucoup plus rapidement.

J'ai donc configuré la scène comme ça…

  1. ajouté une skybox réaliste (nasa)

  2. ajouté quelques formes

  3. ajouté le script SetRenderQueue au plan, à la sphère et au cylindre

  4. définissez l'ordre de file d'attente sur la sphère à 2999 (les autres objets sont à 3000)

  5. puis ajouté le shader DepthMask à la sphère

C'est ça. Toutes les questions me le font savoir!

CalebHC
la source
2
D'oh, je pensais complètement au problème dans mon article ci-dessus (je pensais vraiment aux mailles à trous plats sur les murs / sols). La solution liée montre un objet de trou 3D, et la solution indiquée, dans ce cas, est très simple - tout ce que vous devez réellement faire est d'écrire le `` trou '' dans le z-buffer sans écrire de couleur, et assurez-vous que le trou est tiré tôt.
bluescrn
@bluescrn Pas de soucis! J'apprécie le post détaillé. :)
CalebHC
2

Quelques options pour obtenir l'effet souhaité - mais elles ont un coût:

  • Écrivez les trous dans le tampon de pochoir ou le canal alpha de destination, puis dessinez la skybox en dernier, en utilisant un test de pochoir ou un mélange alpha approprié, et sans test z?

ou

  • Rendre la skybox à une texture au début de l'image et la projeter sur la «géométrie du trou»

Je soupçonne qu'il doit y avoir un moyen de le faire en utilisant / abusant du z-buffer aussi - mais vous voulez probablement tester en z les «polygones de trous» en utilisant leur vrai Z, puis écrire un Z différent. Vous pourriez probablement utiliser plusieurs passes et le tampon de pochoir - dessiner le trou 3 fois avec le rendu configuré comme ceci pourrait fonctionner:

  • Réussite 1: pas de test z, pochoir transparent sous les trous
  • Réussite 2: test z normal, incrémenter la valeur du gabarit (là où le test de profondeur réussit)
  • Passe 3: Effacer Z où le pochoir> 0

Vous devez toujours dessiner dans un ordre spécifique - d'abord l'environnement, puis les trous et enfin la skybox en dernier.

bluescrn
la source