2010-05-18 13 views

risposta

11

Innanzitutto, spegnere la profondità scrive/test (non è necessario preoccuparsi di spegnere il test di profondità se si disegna la prima skybox e svuotare la buffer di profondità):

glDisable(GL_DEPTH_TEST); 
glDepthMask(false); 

Quindi, spostare la fotocamera l'origine e ruotarla l'inverso della matrice modelview:

// assume we're working with the modelview 
glPushMatrix(); 

// inverseModelView is a 4x4 matrix with no translation and a transposed 
// upper 3x3 portion from the regular modelview 
glLoadMatrix(&inverseModelView); 

Ora, disegnare la tua casella di cielo e girare la profondità scrive nuovamente:

DrawSkybox(); 

glPopMatrix(); 
glDepthMask(true); 
glEnable(GL_DEPTH_TEST); 

Probabilmente vorrete usare glPush/PopAttrib() per assicurarvi che gli altri stati vengano correttamente impostati dopo aver disegnato anche lo skybox (assicuratevi di spegnere le cose come illuminazione o miscelazione se necessario).

È necessario eseguire questa operazione prima di disegnare qualsiasi cosa, in modo che tutte le scritture del buffer del colore si verifichino in cima al riquadro del cielo.

+7

skybox come prima cosa resa è il modo migliore per sprecare un po 'di banda. – Bahbar

+4

Vero, tuttavia, penso che l'OP non sia ancora interessato alle prestazioni. Disegnare la skybox per ultima è più complicato in quanto è necessario assicurarsi di aver gestito correttamente oggetti trasparenti e lontani in modo da non agganciarsi allo skybox. L'ottimizzazione per il test iniziale Z dovrebbe essere eseguita dopo aver implementato correttamente. –

1

Non c'è infinito. Un skybox è solo una scatola con texture, con uno 0,0 0,0 normale nel mezzo. Ecco un breve tutorial: link text

+0

Genius. Devi disegnarlo all'infinito (senza profondità), perché non ci può essere nulla di più lontano della skybox. Fai la tua ricerca proprio la prossima volta. – Tara

0

L'approccio migliore che riesco a pensare è disegnarlo su un primo passaggio (o livello), quindi cancellare solo il buffer di profondità. Dopo di ciò, trascina il resto della scena in un altro passaggio. In questo modo lo skybox rimarrà sempre "dietro" la scena. Ricorda solo di usare la stessa fotocamera per entrambi i passaggi e in qualche modo far scattare il skybox sulla fotocamera.

3

Prima, cancellare il buffer.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Quindi, salvare la matrice modelview corrente e caricare l'identità.

glPushMatrix(); 
glLoadIdentity(); 

Quindi rendere il tuo skybox.

Skybox.render(); 

Poi, cancellare il buffer di profondità e continuare normalmente con il rendering

glClear(GL_DEPTH_BUFFER_BIT); 

OtherStuff.render(); 

glutSwapBuffers(); 
2

L'unico problema con il disegno della scatola di cielo è il primo è che il pixel shader verrà eseguito per ogni pixel nella casella di cielo. Solo per essere sovrascritto da un altro oggetto nel tuo mondo in seguito. La cosa migliore è rendere tutti gli oggetti opachi prima di renderizzare il cielo. In questo modo, il pixel shader per la sky box viene eseguito solo per il pixel che supera il test del buffer z.

Problemi correlati