Modifica: questo è solo per la mia esperienza di apprendimento, NON è per motivi di prestazioni che faccio questa domanda.
Questo è per quanto riguarda un motore di terreno simile a Minecraft. Conservo blocchi in blocchi (blocchi 16x256x16 in un blocco). Quando generi un pezzo, utilizzo più tecniche procedurali per impostare il terreno e posizionare gli oggetti. Durante la generazione, mantengo un array 1D per l'intero blocco (solido o no) e un array 1D separato di blocchi solidi.
Dopo la generazione, eseguo l'iterazione attraverso i blocchi solidi controllando i loro vicini in modo da generare solo facce di blocco che non hanno vicini solidi. Memorizzo le facce da generare nella loro lista (ovvero 6 liste, una per ogni faccia / normale). Quando eseguo il rendering di un blocco, eseguo il rendering di tutti gli elenchi del blocco corrente della videocamera e solo degli elenchi rivolti verso la videocamera in tutti gli altri blocchi. Faccio questo memorizzando tutte e 6 le liste in un buffer, quindi cambio semplicemente gli intervalli che disegno.
Usando un atlante 2D con questo piccolo trucco di shader suggerito da Andrew Russell, voglio unire facce simili completamente insieme. Cioè, se sono nella stessa lista (la stessa normale), sono adiacenti l'uno all'altro, hanno lo stesso livello di luce, ecc. So che finirò comunque con i rettangoli, ma dovrebbe ridurre facilmente il mio conteggio dei vertici del 50% o meglio se le mie stime sono corrette.
La mia ipotesi sarebbe quella di avere ciascuna delle 6 liste ordinate in base all'asse su cui poggiano, quindi in base agli altri due assi (l'elenco per la parte superiore di un blocco sarebbe ordinato in base al suo valore Y, quindi X, quindi Z).
Con questo da solo, potrei facilmente unire strisce di facce, ma sto cercando di unire più di semplici strisce quando possibile. Ho letto su questo avido algoritmo di meshing, ma ho molti problemi a capirlo.
Quindi, la mia domanda: per eseguire l'unione dei volti come descritto (ignorando se si tratta di una cattiva idea di terreno / illuminazione dinamica), esiste forse un algoritmo che è più semplice da implementare? Accetterei anche felicemente una risposta che mi guidi attraverso l'avido algoritmo in un modo molto più semplice (un link o una spiegazione).
Non mi dispiace un leggero calo delle prestazioni se è più facile da implementare o anche se è solo un po 'meglio che fare semplicemente strisce. Temo che la maggior parte degli algoritmi si concentri sui triangoli piuttosto che sui quad e usando un atlante 2D così come sono, non so che potrei implementare qualcosa di triangolare in base alle mie attuali competenze.
PS: ho già frustum cull per chunk e come descritto, ho anche abbattuto facce tra blocchi solidi. Non occloro ancora l'occlusione e forse mai.
* Modifica: ho implementato la mia piccola tecnica, che probabilmente ha un nome, ma passo semplicemente attraverso le mie 6 liste che sono ordinate in base agli assi su cui poggiano, seguite dal tipo di blocco e quindi dal livello di illuminazione. Ierate attraverso di essi, creando nuovi rettangoli mentre procedo e li coltivo simultaneamente (con una forte propensione verso un certo asse). Non è sicuramente ottimale, ma è piuttosto veloce e riduce il mio numero di vertici di circa il 50% in media. Il commento di Byte56 è l'armadio che penso a una vera risposta, ma non posso selezionarlo per la risposta / generosità.
Ecco il mio modo semplice e veloce che sto gestendo questo problema DOPO aver generato l'intero terreno iniziale senza molta ottimizzazione. Supponendo che tutti i quadrati indicati siano la stessa immagine, livello di luce, normale, ecc. Ogni colore è un quad diverso che renderei. Con i miei elenchi ordinati così come sono, questo è un approccio molto semplice / veloce.