2015-05-03 16 views
5

Quando si esegue il rendering di un cielo con una trama fissa nei giochi 3D, le persone spesso creano innanzitutto 6 trame in una mappa cubo, quindi eseguono il rendering di un cubo attorno alla telecamera. In GLSL, puoi accedere ai pixel nelle trame con una coordinata normale anziché una texture, e puoi facilmente ottenere questo risultato normalizzando la posizione del frammento rispetto alla telecamera. Tuttavia, questo processo può essere eseguito con qualsiasi forma che circonda la fotocamera, perché quando normalizzi ciascuna posizione, si otterrà sempre una sfera. Ora mi chiedo: Perché è sempre un cubo e non un tetraedro? Il rendering di un cubo richiede 12 triangoli, un tetraedro solo 4. E come ho già detto, qualsiasi forma che circonda la fotocamera funziona. Quindi i tetraedri prendono meno VRAM e sono più veloci da renderizzare, senza alcun inconveniente? Perché non usarli?Perché le persone non usano i tetraedri per le skybox?

+1

Skyboxes sono facili da implementare e facile da determinare coordinate di texture. Ecco perché è più comune. –

+0

Bene, non hai bisogno di coordinate texture. Immagino che capire la posizione dei vertici sia un po 'difficile. – Pikaju

risposta

4

non avete bisogno di un po 'di geometria dell'ambiente a tutti. Tutto quello che devi fare è disegnare un quad a schermo intero, e solo calcolare le coordinate di trama corrette per esso. Ora con GL moderna, non abbiamo neanche bisogno di fornire i dati di vertice per questo, possiamo usare attributless resa:

Vertex Shader:

#version 330 core 
out vec3 dir; 
uniform mat4 invPV; 
void main() 
{ 
     vec2 pos = vec2((gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0; 
     vec4 front= invPV * vec4(pos, -1.0, 1.0); 
     vec4 back = invPV * vec4(pos, 1.0, 1.0); 

     dir=back.xyz/back.w - front.xyz/front.w; 
     gl_Position = vec4(pos,1.0,1.0); 
} 

dove invPV è inverse(Projection*View), quindi ci vorrà la vostra l'orientamento della fotocamera e la proiezione in considerazione. In linea di principio, ciò può essere ulteriormente semplificato, in base a quanti vincoli è possibile applicare alla matrice di proiezione.

Fragment Shader:

#version 330 core 
in vec3 dir; 
out color; 
uniform samplerCube uTexEnv; 
void main() 
{ 
     color=texture(uTexEnv, dir); 
} 

Per utilizzare questo, è sufficiente associare un VAO vuota e la texture, caricare il tuo matrice invPV e chiamare glDrawArrays(GL_TRIANGLE_STRIP, 0, 4).

Questo approccio potrebbe ovviamente essere utilizzato per il texture mapping sferica, invece di mappe cubo

5
  1. si tratta della profondità della vista e forma

    la migliore forma è sfera (mezzo) skybox perché la sua superficie resa sta proiettando allo spazio telecamera quasi senza distorsioni. Se usi qualsiasi altra forma, gli artefatti di proiezione si verificano soprattutto sugli angoli, ad esempio la maggior parte delle app/giochi utilizzano il cubo skybox. Guarda il sole con raggio finito (non solo un punto singolo) e ruota la vista in modo che il sole possa passare da un centro all'altro. Poi di solito il sole viene distorta dalla forma circolare/disco a forma ellittica/ovale:

    cube distortion example enter image description here

    questo è dovuto al cambiamento distanza tra skybox e fotocamera. stella Se lo si confronta con rese direttamente:

    rendered sky (no skybox)

    allora si può vedere la differenza. Prima immagine è la prima immagine relativa trovata da Google (da qualche gioco) il secondo è schermata sotto forma di spazio Ingegneri penso e l'ultimo è reso dal mio astro app vedere

    Così il più è la forma lontana dalla sfera più le distorsioni si ottengono.

    utilizzando la piramide a 4 lati è anche peggio del cubo perché gli angoli tra i lati sono peggiori creando artefatti ancora più grandi. Un altro problema è che hai bisogno di dimensioni maggiori della piramide per coprire lo stesso spazio. Se si utilizza Depth Buffer per alcuni scopi durante il rendering skybox, si potrebbe influire significativamente sulla precisione aumentando l'aereo Z_far.

  2. Overhead

    diference tra 6 e 4 poligoni non è tanto perché il skybox è enorme (coperchio vista intera) la velocità è determinata principalmente dal conteggio di pixel/texel depositata per non schermare contano i vertici. Quindi la piramide potrebbe essere ancora più lenta del cubo perché deve avere facce più grandi (sono necessarie più iterazioni dell'interpolatore).Ma se vuoi usare lo sferico skybox allora hai bisogno anche di una trama sferica perché se si usasse la texture cubo standard la distorsione sarà ancora presente e questi sono più difficili da mantenere, ... ed è per questo che i cubi sono più usati .

  3. skybox sferici

    hanno bisogno di vari tipi di texture. tessitura emisferica assomiglia a questo:

    hemisphericall texture

+1

Sei sicuro di questo? Se usassi 6 trame standard e le mappassi su un cubo con le normali coordinate della trama, allora sì, risulterebbe distorto. Ma dal momento che normalizzo le posizioni dei vertici nello shader dei frammenti, ottengo una sfera e, come hai già detto, una sfera è perfetta per uno skybox. Inoltre, l'interpolazione delle facce in realtà non dovrebbe avere importanza, dal momento che la dimensione del modello è completamente irrilevante (se il depth buffer è disabilitato) ... – Pikaju

+0

@Pikaju Sono d'accordo ma per farlo funzionare hai bisogno di una texture mappata sferica invece che cubica uno o l'altro avresti skybox sferico perfetto con una trama distorta che ha risultati simili come skybox cubo – Spektre

+0

@Pikaju ha aggiunto l'immagine di un esempio di trama emisferica alla fine della risposta – Spektre

Problemi correlati