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?
risposta
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
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:
questo è dovuto al cambiamento distanza tra skybox e fotocamera. stella Se lo si confronta con rese direttamente:
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.
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 .
skybox sferici
hanno bisogno di vari tipi di texture. tessitura emisferica assomiglia a questo:
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
@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
@Pikaju ha aggiunto l'immagine di un esempio di trama emisferica alla fine della risposta – Spektre
- 1. Perché le persone usano ProjectData
- 2. Perché le persone usano i = i + 1 invece di i ++?
- 3. pixel.gif, perché le persone lo usano?
- 4. Perché le persone non usano <CFLOGIN>?
- 5. Perché le persone usano ATL per la programmazione COM?
- 6. In che modo le persone usano Yeoman?
- 7. Perché le persone usano Command-line invece di IDE?
- 8. C++ perché le persone non usano maiuscole nel nome dei file di intestazione?
- 9. Quali tecniche/strategie usano le persone per costruire oggetti in C (non C++)?
- 10. JavaScript Speech-to-Text per le persone non vedenti
- 11. Perché le persone usano bouncycastle invece del provider JCE integrato in Java? Qual è la differenza?
- 12. È il codice per i computer o per le persone?
- 13. HTML5: perché le persone non utilizzano "ContentEditable" per i loro siti Web?
- 14. Capire quante persone usano il mio software
- 15. Che modalità usano le persone quando usano Emacs per modificare pagine Web che contengono CSS, javascript e HTML?
- 16. Quale hosting normalmente usano le persone per pubblicare il sito Web Django?
- 17. Migliorare le immagini per persone daltonici
- 18. Le fabbriche astratte usano "nuovo"?
- 19. Perché le persone spediscono i log a Logstash con NXlog e non con Logstash stesso?
- 20. Perché le persone minificano css e javascript, quando abbiamo gzip?
- 21. Perché i newtypes non usano i tratti dal tipo interno?
- 22. Come posso impressionare le persone con le capacità di Perl?
- 23. prestazioni Haskell quando si usano le classi e le istanze
- 24. Assegnare le persone agli edifici rispettando le preferenze?
- 25. Come impacchettare un programma da condividere con le persone?
- 26. Limitare le persone utilizzando PHP GET variabile
- 27. Per quali ragioni le persone scelgono Ruby su Java?
- 28. Le CTE usano spazi in tempdb?
- 29. Perché le persone utilizzano il parametro proprietario predefinito su Nessuno in __get__?
- 30. cuciture Skybox in OpenGL
Skyboxes sono facili da implementare e facile da determinare coordinate di texture. Ecco perché è più comune. –
Bene, non hai bisogno di coordinate texture. Immagino che capire la posizione dei vertici sia un po 'difficile. – Pikaju