Implementazione della decalcomania


11

Ho avuto problemi a trovare informazioni sulle decalcomanie, quindi forse questa domanda aiuterà gli altri. L'implementazione è per un renderer forward.

Qualcuno potrebbe confermare se ho ottenuto l'implementazione della decalcomania, giusto?

  • Definisci un cubo di qualsiasi dimensione che definirà il volume di proiezione nello spazio comune. Controlli l'intersezione del triangolo con il cubo definito per ricevere i triangoli che influenzeranno la proiezione.
  • Taglia questi triangoli e li salvi.
  • Quindi usi i trucchi con la matrice per calcolare le coordinate UV per i triangoli salvati che faranno riferimento alla trama che stai proiettando.
  • Per fare questo prendi i vettori che rappresentano l'altezza, la larghezza e la profondità del cubo nello spazio comune, in modo che l'angolo in basso a sinistra sia l'origine.
  • Lo metti in una matrice come vettori di unità i, j, k, imposta la traduzione per il cubo, quindi inverti questa matrice.
  • Moltiplichi i vertici dei triangoli salvati per questa matrice, in questo modo ottieni le loro coordinate all'interno di un cubo di dimensioni da 0 a 1 che usi come coordinate UV.
  • In questo modo hai i triangoli originali su cui stai proiettando e hai coordinate UV per loro (le coordinate UV fanno riferimento alla trama che stai proiettando).
  • Quindi si esegue nuovamente il rendering dei triangoli salvati sulla scena e sovrascrivono l'area di proiezione con l'immagine proiettata.

Ora le domande per le quali non sono riuscito a trovare le risposte. L'ultimo punto è giusto? Non ho mai eseguito il clipping del software, ma sembra essere abbastanza soggetto a errori, a causa della precisione limitata, che ci sarà un po 'di combattimento z che si verifica per la trama proiettata. Inoltre, il modo di ottenere le coordinate UV è corretto?


Risposte:


5

Dai un'occhiata a questo articolo:

http://blog.wolfire.com/2009/06/how-to-project-decals/

Sembra che stia usando lo stesso identico approccio che stai usando. Non parla di z-fighting, ma potrebbe sicuramente diventare un problema a grandi distanze.

Il mio suggerimento sarebbe di disabilitare le decalcomanie dopo una certa distanza se il combattimento z diventa molto visibile.


ho visto questo articolo più volte, il fatto è che non parla affatto di quello che sto chiedendo, come hai già detto, il combattimento con z non è davvero un problema di distanza, è solo che tu stai cercando di eseguire il rendering proprio sopra la geometria esistente e a causa della precisione limitata, puoi / non puoi essere sicuro che sarà in cima o esattamente nello stesso posto
dreta,

1
Quando si disegnano le decalcomanie, è sempre possibile impostare la funzione di confronto del buffer di profondità su un valore minore o uguale piuttosto che minore di così le decalcomanie vengono sempre disegnate proprio sulla superficie che stanno interessando.
jmegaffin,

1

Quello che ho fatto per risolvere il combattimento Z è stato di aumentare il valore Z del vertice di una piccola quantità, nel mio shader per decalcomanie, dopo che è nelle coordinate dello schermo.

OK ..... Uso decalcomanie a maglia montate. Creo una maglia nxn con Y seduto sul terreno. Uso il codice per trovare la Y sulla mesh poligonale dei terreni. Dopo tutti i transfrom, sto disegnando sopra la geometria esistente nelle coordinate dello schermo. Il buffer di profondità è nelle coordinate dello schermo, quindi spostando leggermente la Z dei poligoni delle decalcomanie verso lo schermo, si ferma il combattimento Z. In questo modo ho ridotto della metà la quantità di poligoni che compongono le maglie delle decalcomanie montate. Questo è il vecchio codice 120

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Spero che questo lo spieghi meglio .. (come richiesto)

Telaio interamente in filo metallico.

Solo terreno del filo.


1
Questa risposta sembra particolarmente breve e non specifica. Potresti chiarire la tua risposta?
Gnemlock,

1
Non è difficile da capire .. Sposto il vertice di un po 'nella direzione Z nello spazio dello schermo. Perché in OpenGL guardi sempre Z positiva nello spazio dello schermo, spostando il negativo Z di una piccola quantità risolvi il combattimento Z. Tuttavia, c'è un problema con questo. Mentre si esegue lo zoom indietro, la z può spostare la decalcomania molto più del necessario. Una soluzione è ridimensionare la quantità di spostamento dall'occhio alla distanza del vertice.
Mike O,
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.