2010-05-18 10 views

Respuesta

11

En primer lugar, apague la profundidad escribe/prueba (que no tiene que molestarse con la desactivación de las pruebas de profundidad si se dibuja el palco primero y despejar su buffer de profundidad):

glDisable(GL_DEPTH_TEST); 
glDepthMask(false); 

A continuación, mover la cámara al origen y girarlo la inversa de la matriz 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); 

Ahora, llamar su cuadro de cielo y girar de nuevo en profundidad escribe:

DrawSkybox(); 

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

Probablemente querrá usar glPush/PopAttrib() para asegurarse de que sus otros estados se configuren correctamente después de dibujar el skybox también (asegúrese de apagar cosas como encender o mezclar si es necesario).

Debería hacer esto antes de dibujar cualquier cosa para que todas las memorias de búfer de color sucedan en la parte superior de su casilla de cielo.

+7

skybox como lo primero que se representa es la mejor manera de perder un montón de ancho de banda. – Bahbar

+4

Es cierto, sin embargo, creo que el OP aún no está preocupado por el rendimiento. Dibujar el último palco es más complicado ya que debes asegurarte de haber manejado los objetos transparentes y lejanos correctamente para no engancharlos en el palco celestial. La optimización para la prueba Z temprana debe realizarse después de que tenga una implementación en funcionamiento. –

1

No hay infinito. Un palco es simplemente una caja texturizada, con una norma de 0,0,0 en el medio. Aquí hay un breve tut: link text

+0

Genius. Tienes que dibujarlo al infinito (sin profundidad), porque no puede haber nada más lejos que la caja del cielo. Investigue bien la próxima vez. – Tara

0

Lo mejor que puedo pensar es dibujarlo en una primera pasada (o capa), luego borrar solo el buffer de profundidad. Después de eso simplemente dibuja el resto de la escena en otro pase. De esta forma, la caja del cielo siempre permanecerá "detrás" de la escena. Solo recuerde usar la misma cámara para ambos pases y de alguna manera ajustar el palco celeste a la cámara.

3

Primero, despeje el almacenamiento intermedio.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Luego, guarde su matriz modelview actual y cargue la identidad.

glPushMatrix(); 
glLoadIdentity(); 

A continuación, renderice su skybox.

Skybox.render(); 

A continuación, borrar el buffer de profundidad y continuar normalmente con la representación

glClear(GL_DEPTH_BUFFER_BIT); 

OtherStuff.render(); 

glutSwapBuffers(); 
2

El único problema con el dibujo de la caja cielo es primero es que el sombreado de píxeles se ejecutará para cada píxel en el cuadro de cielo. Solo para ser sobreescrito por otro objeto en tu mundo más adelante. Su mejor opción es renderizar primero todos los objetos opacos y luego renderizar su casilla celeste. De esta forma, el sombreador de píxeles para el recuadro del cielo solo se ejecuta para el píxel que pasa la prueba del tampón z.

Cuestiones relacionadas