Come unire i cerchi di selezione delle unità?


16

Vorrei sapere come fare questo effetto della selezione del cerchio unito. Ecco le immagini per illustrare:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Fondamentalmente sto cercando questo effetto:

inserisci qui la descrizione dell'immagine

Come si può ottenere l'effetto di unione dei cerchi? Non ho trovato alcuna spiegazione riguardo a questo effetto. So che per proiettare quella trama posso sviluppare un sistema di decalcomanie ma non so come creare l'effetto di fusione.

Se possibile, sto cercando una soluzione puramente shader.


Potresti spiegare cosa intendi per "effetto unione"?
Wondra,

Ovviamente, se guardi i personaggi in alto a destra dello screenshot, le decalcomanie non si incrociano ma i due a sinistra incrociano il loro cerchio blu e si fondono. Ho aggiunto un nuovo screenshot per mostrare l'effetto.
MaT

Insisti sulla soluzione shader? Altrimenti, l'hai appena risolto nella tua ultima foto.
Wondra,

L'ultimo screenshot mostra solo l'effetto che sto prendendo di mira. Il risultato finale dovrebbe apparire come negli screenshot precedenti.
MaT

1
Sì, sono d'accordo, penso che costruiscano dinamicamente un cerchio mesh con la trama e quindi tagliano la mesh per unirle. È anche una buona soluzione ma penso che sia più limitato in termini di effetto che puoi fare.
MaT

Risposte:


8

Ci sono alcuni trucchi che puoi fare:

Z-buffer

Dopo aver eseguito il rendering di tutti gli altri oggetti, per ogni unità eseguire il rendering di un cerchio trasparente di dimensioni inferiori con valore Z massimo. Quindi eseguire il rendering delle decalcomanie dei cerchi di selezione sul terreno. Dato che sono in basso in ordine Z, verranno scartati quando si trovano sotto le unità.

Essere completamente trasparenti significa che il cerchio viene scritto solo nel buffer Z (valore Z massimo). Ora quando esegui il rendering delle decalcomanie, vengono testati rispetto ai valori del buffer Z e se superano il test vengono visualizzati (cosa che accade solo al di fuori dei cerchi)

stampino

Come con l'approccio precedente, ma questa volta usa un buffer di stencil. Rendering di cerchi più piccoli per unità con un valore di stencil, quindi esegui il rendering delle decalcomanie. Imposta lo stencil per eliminare tutti gli elementi con il valore dello stencil.


La tecnica Z-Buffer è interessante ma non capisco come il primo cerchio trasparente possa agganciare le decalcomanie del terreno.
MaT

0

Ad esempio, è possibile verificare lo shader di pixel per il rendering della decalcomania se esiste un'intersezione con qualsiasi altra decalcomania e in tal caso uccidere il pixel. È abbastanza efficace da fare per questo tipo di decalcomanie circolari.


1
Suppongo che tu abbia saltato la parte dalla tua risposta - per passare tutte le posizioni dei cerchi e i raggi allo shader.
Kromster dice di sostenere Monica il

@Krom Se OP esprime interesse per la soluzione, sono felice di fornire ulteriori dettagli.
JarkkoL,

0

Intendi quei cerchi blu sul terreno?

Potrebbe esserci un modo più intelligente per farlo, ma considera la mia soluzione come un esempio di come farlo. Rendi le tue cerchie su una trama vuota separata delle dimensioni dello schermo. A questo punto puoi mescolarli insieme, come preferisci. A seconda delle tue esigenze puoi scrivere a colori o solo le informazioni sulla presenza di un cerchio in un determinato pixel. Tuttavia, avrai sicuramente bisogno di informazioni sulla profondità per ogni pixel che scrivi se vuoi un effetto Z-test.

Quando si esegue il rendering del terreno dopo il passaggio precedente, è possibile campionare la trama precedentemente creata, utilizzando le coordinate dello schermo in pixel shader, come UV. Ora sai che il cerchio dovrebbe o non dovrebbe essere proiettato in un dato pixel del terreno. Tuttavia, in questo modo funzionerà come se il test Z fosse disabilitato, quindi un terreno non può nascondere alcun cerchio. Se vuoi che un terreno nasconda dei cerchi dietro di esso, esegui un test di profondità prima di fondere un cerchio con la trama del terreno. È possibile utilizzare una leggera deviazione per abilitare il rendering di cerchi che si trovano solo un po 'sotto il terreno, ma si vorrebbe comunque renderli.


Modifica: ora per ottenere l'effetto dei cerchi uniti ciò che devi fare è: quando esegui il rendering su una trama separata, devi verificare se è già presente un cerchio nel punto in cui stai provando a renderne uno nuovo. (Controlla se la trama ha un valore lì) in tal caso, cancella questo pixel. Questo dovrebbe dare l'effetto di "contorno" quando due o più cerchi si sovrappongono. Affinché ciò funzioni correttamente, tuttavia dovrai eseguire questo test solo per l'interno del cerchio, non per il bordo. Quindi, durante il rendering dei cerchi, scrivi un valore specifico sulla trama di output, che indica che è un cerchio all'interno. Quindi devi solo non rendere nulla sul cerchio all'interno e dovresti essere bravo.

Modifica2: per il tuo semplice esempio rosso / verde: prima di eseguire il rendering di qualsiasi pixel, controlla se questo pixel non è già verde. Se lo è, non renderizzare. Questo farà il trucco. In effetti, mentre scrivi sulla trama puoi anche usare il rosso / verde per l'esterno / l'interno del cerchio, e poi mentre fai il rendering del terreno leggi quei valori e convertili nel colore desiderato.

Se la mia risposta è troppo astratta per caso, fammi sapere.


Ho un'idea generale, ma come dici tu, è un po 'astratto per me per quanto riguarda i cerchi uniti :)
MaT

0

Ci sono alcune opzioni Come metodo generale, i buffer di stencil sono spesso molto utili quando è necessario mascherare determinati disegni, come il contorno in cui i cerchi si sovrappongono nell'esempio.

In questo caso, penso che ciò possa essere fatto altrettanto facilmente senza un buffer di stencil. È possibile utilizzare il buffer di profondità per eliminare il contorno in cui i cerchi si sovrappongono. L'idea è di disegnare l'interno dei cerchi solo nel buffer di profondità (poiché non vogliamo vedere l'interno), quindi disegnare il contorno. In questo modo, la parte del contorno che si sovrappone a un altro cerchio verrà eliminata dal test di profondità.

L'unica avvertenza è che devi stare attento ai combattimenti in profondità. È possibile utilizzare un piccolo offset per assicurarsi che i contorni siano effettivamente dietro l'interno e vengano eliminati dal test di profondità. Un'alternativa sarebbe usare glPolygonOffset().

Supponiamo che tu abbia due cerchi paralleli al piano xy, con centri in (x1, y1, z) e (x2, y2, z). E hai queste funzioni di disegno:

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

La sequenza di disegni si presenta così, con deltaun piccolo offset:

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

Dalla parte superiore della mia testa, se queste decalcomanie sono disegnate come dischi, verificherei ogni cerchio per intersezione l'uno contro l'altro, e metterei i punti di intersezione in un array. Quindi disegna archi che non si trovano all'interno di un incrocio. Questa non è una soluzione shader, però.


Sì, ci ho pensato anche io :) ma come hai detto non è una soluzione shader e non è una soluzione molto generica. Ma grazie !
MaT

È una descrizione piuttosto vaga
Kromster dice di sostenere Monica il

0

Vuoi stencil qui. Il primo passaggio esegue il rendering dei cerchi nel buffer dello stencil. Il secondo passaggio rende il contorno visibile , ovunque il buffer dello stencil non sia cambiato. Il secondo passaggio deve utilizzare una geometria più grande del primo passaggio, in questo caso è sufficiente un semplice scalare lineare.

Mentre la soluzione che ho per disegnare i contorni qui è più del necessario (poiché lo shader trasforma tutti i bordi della mesh in un quad completo), segue questo approccio: disegnare il modello originale nel buffer dello stencil, quindi eseguire il rendering di una versione più grande in cui il buffer dello stencil è ancora 0.


Grazie! Quindi, invece di disegnare prima le parti visibili, dovrei iniziare con il rendering dei cerchi trasparenti nello stencil. Ma come posso rendere i cerchi rotondi trasparenti? Non posso limitare il rendering di parti dell'immagine nello stencil. Quando eseguo il rendering sullo stencil, tutto va lì, vero?
Doodlemeat

Sì, ecco perché il secondo passaggio (la porzione visibile) viene ridimensionato: quindi i suoi limiti sono più grandi del buffer dello stencil. Devi solo applicare uno scalare di vertice nel secondo passaggio (cerca gli shader di contorno, molti di loro usano lo scalare più semplice a cui mi riferisco). Non è inoltre possibile modificare il buffer dello stencil se il colore è trasparente. Probabilmente avrai bisogno di una seconda maschera di trama in questo caso o puoi fare un po 'di matematica a distanza per determinare il cerchio. Avrei bisogno di un paio d'ore e di accedere a Unity per fornire qualsiasi codice.
Draco18s non si fida più di SE

Hmm, che dire di avere un'immagine in bianco e nero solo per scrivere nel buffer dello stencil nel primo passaggio in modo che il nero diventi 0 e il bianco diventi 1 nello stencil. È anche possibile?
Doodlemeat

Questo è ciò che intendevo con una seconda maschera di trama. Sono abbastanza sicuro che funzionerebbe, non riesco proprio a verificare senza avere Unity di fronte a me, che non avrò per oltre 24 ore.
Draco18s non si fida più di SE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.