2017-02-17 4 views
0

J'ai construit un shader de surface de travail (appelé "wonderland") qui le rend invisible à moins qu'un compagnon "lookingGlass" le croise du point de vue de la caméra. Arrangement simple de shader de pochoir.HLSL (Ok spécifique à l'unité, pas nécessaire) combinant Stencil et le découpage "reverse" de l'espace monde

Peasy facile.

Je peux ajouter des paramètres de shader pour spécifier un plan, ou même juste une valeur minimale de l'espace Z, et utiliser clip() pour afficher uniquement les pixels d'un côté de ce plan ... (en d'autres termes, je pourrais utiliser ça Ce que je veux faire est d'utiliser le pochoir sur les surfaces "à travers le miroir", (pour révéler la géométrie qui est à l'intérieur du miroir) et de toujours rendre ces surfaces quand le pochoir est utilisé. ils sont sur "notre" côté du miroir (pour toujours les montrer s'ils sont de ce côté du portail en verre). Par exemple, si z < 0, s'affiche si la valeur Stencil Ref est satisfaite. si z> = 0, restitue indifféremment. Maintenant, dans Unity I peut pouvez joindre deux matériaux au composant MeshRenderer (un avec un shader shader, un avec un shader "cutoff") - cela fonctionne bien. C'est vraiment génial, en fait, au moins visuellement. Mais même si je ne l'ai pas encore évalué, je crois instinctivement que cela va avoir un impact massif sur le framerate s'il y a un certain nombre d'objets, une géométrie assez compliquée, etc., mis en place avec cet arrangement.

(Je peux aussi gérer la fixation des shaders dans le code, et ne le faire quand j'attends quelque chose à la transition, mais je suis vraiment l'espoir d'obtenir un shader unifié de ce pour éviter les appels inutiles de tirage.)

Répondre

0

En fin de compte, ce que je cherchais à faire est impossible.

Les deux shaders que je souhaite combiner sont tous deux des shaders de surface. Alors que vous pouvez combiner plusieurs shaders de surface dans un shader multipass, vous ne pouvez pas combiner plusieurs shaders de surface, avec un Stencil, et avec un clip() où le clip est appliqué pour passer que le Stencil n'est pas et vice versa.

Il existe des combinaisons qui peuvent réaliser des parties de ce but, ou atteindre l'objectif entier avec des shaders surface et vert (ou autres), mais la combinaison des exigences stipulées par cette question n'est pas supportée comme souhaité.

Bien que cela ne réponde pas à la question, la solution de contournement dans Unity consiste à créer deux matériaux fournissant chaque fonctionnalité. Ils peuvent tous deux exister sur l'élément qui a besoin des deux pièces, et le code peut gérer autrement si l'un ou l'autre ou les deux sont activement utilisés.

Des solutions similaires seraient disponibles dans d'autres packages.