Come dipingere su modelli 3d
Ho cercato questo argomento per molto tempo e praticamente non ho trovato informazioni su di esso.
Se abbiamo un modello 3d con layout uv. Qual è la tecnica di base per la pittura 3D su detto modello con un pennello? Una pennellata è costituita dai dati / dall'immagine dei pixel del pennello disposti in successione. Quindi proiettiamo ogni singola immagine del pennello sulla superficie dell'oggetto? (Anche se in realtà per fare questo dovremmo proiettare l'oggetto sullo spazio dell'immagine). Sono già riuscito a proiettare le trame sugli oggetti. E proiettare ogni singola immagine del pennello sembra decisamente fattibile, ma non sono sicuro che sia pratico dal punto di vista delle prestazioni e se ci siano tecniche migliori.
Risposte
Non posso darti un approccio "migliore" qui, ma penso che l'approccio a
proietta ogni singola immagine del pennello sulla superficie dell'oggetto
non è davvero un problema di prestazioni se lo si implementa utilizzando la GPU. Soprattutto in un ambiente di editor, dove non succede molto rispetto a un gioco per computer. In pratica, tutto ciò che vuoi fare è eseguire il rendering di una singola immagine per fotogramma su un insieme limitato di trame. Posso darti una bozza di come affronterei l'argomento se avessi bisogno di questa funzione. Tuttavia, poiché non l'ho ancora implementato da solo, potrebbero esserci alcune complicazioni e problemi a cui non avevo pensato, quindi fammi sapere nei commenti se qualcosa non funziona come previsto.
Trova le superfici interessate
- Usa gli angoli della trama del pennello e genera un tronco di proiezione del pennello ridotto
- Controlla tutti gli oggetti e trova le superfici più vicine -> Se usi già un qualche tipo di selezione per la tua scena, riutilizza l'elenco degli oggetti già selezionati, poiché il pennello può solo "vedere" ciò che vede la telecamera
- Identifica le sottosuperfici / triangoli interessati dal pennello
Raccogli tutte le trame interessate. Dovresti sapere, per ogni superficie interessata, quale texture possiede. In modo ottimale, l'intero oggetto ha solo una singola texture UV.
Crea un programma shader per renderizzare la tua texture.
- attenzione, il vertex shader deve calcolare le coordinate UV normalizzate e passarle lungo la pipeline come posizione del vertice, poiché sono la posizione nella tua texture. Controlla di quali informazioni aggiuntive hai bisogno per passare alla pipeline.
- Nello shader frammento, sovrascrivi ogni pixel che si trova sotto il pennello. Potrebbe essere necessario utilizzare la fusione qui per i pennelli non rettangolari.
- La posizione del pennello è un po 'complicata. Ne hai bisogno nello spazio UV delle texture nello shader dei frammenti e non sono sicuro se puoi calcolarlo nello shader dei vertici. Quindi potrebbe essere necessario farlo nello shader di frammento o in alternativa in uno shader di geometria. Il problema che vedo è che l'angolo in cui la proiezione del pennello colpisce la superficie non può essere calcolato nel vertex shader ed è necessario determinare l'area coperta. Lo shader della geometria dispone di informazioni sufficienti per calcolare l'angolo e l'area coperta. Nello shader frammento, non è possibile calcolare nemmeno l'angolo, ma lì puoi semplicemente controllare se e dove si trova nel tronco di proiezione del pennello.
Ora esegui semplicemente il rendering delle tue trame.
- Lega la trama del pennello
- Per ogni texture interessata
- Associa la trama come destinazione di rendering
- Esegui il rendering di tutti gli oggetti interessati e lascia che la GPU scelga quali pixel devono essere sovrascritti.
(Facoltativo) Se desideri salvare le modifiche, devi rileggere le trame dalla GPU e salvarle.
Poiché il lavoro principale è svolto dalla GPU, dovrebbe essere abbastanza veloce. Tuttavia, posso vedere alcuni problemi con l'approccio descritto quando il pennello colpisce più oggetti / trame che sono parzialmente sovrapposti. Stabilire quale pixel del pennello influisce su quale texture / oggetto può diventare disordinato. Potrebbero esserci alcuni trucchi per stencil / buffer di profondità che è possibile applicare, ma penso che questo sia un argomento per un'altra domanda.
Finché nessun pixel sulla trama viene utilizzato due volte, è possibile eseguire il rendering della geometria e visualizzare le coordinate uv (coordinate della trama). Di solito sono una combinazione di rosso e verde (2d). Quando usi un pennello, devi solo leggere le coordinate uv che hai colpito e colorare la trama nella posizione (uv) nel colore desiderato.
Suggerimento: dipingi su una seconda trama, in modo da non distruggere il colore della trama originale.
Svantaggi: a volte la risoluzione della trama dei diversi triangoli all'interno di una geometria varia. Quindi su alcune facce apparirà carino, e su altre sarà pixelato.
Come detto prima, se la mesh (geometria) utilizza due volte la stessa parte di una texture (due facce che mirano alle stesse coordinate della texture), e si disegna su una di esse, anche l'altra verrà dipinta.
Puoi farlo in modi diversi.
Ma il modo più logico per me è che ci sono punti campionati lungo il percorso, quindi vengono utilizzate spline / curve benzier per renderlo uniforme (i punti aggiuntivi possono essere interpolati), dopodiché viene proiettato e salvato sulla trama. Quindi nessun punto "ogni" deve essere campionato.