Vedo alcuni ampi approcci là fuori per fare l'ombreggiatura cel:
- Duplicazione e ingrandimento del modello con normali capovolte (non un'opzione per me)
- Lo shader Sobel filter / fragment si avvicina al rilevamento dei bordi
- Il buffer dello stencil si avvicina al rilevamento dei bordi
- Approcci shader di Geometria (o vertice) che calcolano le normali di faccia e bordo
Sono corretto nel ritenere che l'approccio incentrato sulla geometria offra il massimo controllo sull'illuminazione e sullo spessore della linea, ad es. per il terreno dove potresti vedere la sagoma di una collina che si fonde gradualmente in una pianura?
E se non avessi bisogno dell'illuminazione dei pixel sulle superfici del mio terreno? (E probabilmente non lo farò mentre pianifico di usare l'ombreggiatura / l'ombreggiatura basata su vertici o texturemap basati su celle.) Sarei quindi meglio attenermi all'approccio del tipo di geometria, o preferirei invece un approccio spazio su schermo / frammento per semplificare le cose? Se è così, come potrei ottenere il "inchiostrazione" delle colline all'interno della silhouette della mesh, piuttosto che solo il contorno dell'intera mesh (senza dettagli "inchiostro" all'interno di quel contorno? ( Contorni suggestivi , pieghe dell'AKA ).
Infine, è possibile emulare a buon mercato l'approccio a capovolto normale, usando uno shader di geometria? La mia preoccupazione per questo è che potrei certamente duplicare ogni singolo vertice e ridimensionarli di conseguenza, ma come approccerei capovolgendo le normali e distinguendo i colori nello shader di frammenti?
Quello che voglio - variare lo spessore della linea con linee intrusive all'interno della silhouette ...
Quello che non voglio ...
EDIT: ulteriori ricerche hanno rivelato il seguente ...
Dal momento che ho un enorme numero di vertici sul terreno, anche considerando il LoD basato sulla distanza, né le normali capovolte né un approccio basato sullo shader della geometria (anche con l'abbattimento del frustum) sarebbero un'opzione sensata a causa della pura complessità computazionale coinvolta nella duplicazione e nel ridimensionamento di tutti vertici caricati.
Considerando che non ho bisogno di illuminazione per pixel sotto forma di ombreggiatura a tono solido sulle superfici del terreno, diventa anche meno prudente considerare qualsiasi approccio basato sul normale al viso - altrimenti un requisito per una corretta illuminazione della superficie - in quanto questi sono naturalmente piuttosto costosi da calcolare. È tuttavia vero che offrono il massimo grado di controllo; per esempio, la capacità di sfumare i bordi usando tratti "artistici": bello, ma ancora non praticabile per un ambiente di gioco estremamente complesso.
I buffer di stencil sono qualcosa che preferirei evitare poiché preferirei fare tutto il lavoro negli shader. (L'esempio sopra con il contorno rosso è stato fatto con un buffer di stencil - vecchia scuola.)
Questo lascia frammenti di shader approcci spazio-immagine. La complessità computazionale è ridotta al numero di frammenti piuttosto che al numero di vertici (nel mio caso, si tratta di 10-100 volte meno operazioni di quelle che avrei dovuto fare nello shader della geometria). Ciò richiede più di un passaggio di rendering per generare un g-buffer (costituito da un buffer normale e facoltativamente anche da un buffer di profondità) al quale possiamo applicare filtri di discontinuità (es. Operatore Sobel). La discontinuità di profondità è ciò che consente contorni e pieghe suggestivi. Il mio unico cavillo con questo approccio è l'incapacità di fornire un controllo più preciso sulle larghezze dei bordi inchiostrati, sebbene con il giusto algoritmo nello shader di frammenti, sono sicuro che ciò sarebbe possibile.
Quindi la domanda ora diventa più specifica: come farei esattamente per ottenere larghezze dei bordi variabili, in particolare sulla sagoma esterna, in uno shader di frammenti?