Hola a todos,
estoy haciendo un programilla en C++ utilizando opengl que pinta un trozo de terreno generado aleatoriamente (un heightmap) y un skybox. Es como el típico programa de ejemplo que te puedes encontrar en un tutorial de generación de terreno. Para usar el Z-buffer hago lo siguiente:
- En la inicialización de la ventana (yo uso glut) hago esto:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
- En la inicialización de la escena (solo se ejecuta una vez al inicio del programa):
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- La función que pinta la escena hace esto:
/** Se configura la perspectiva y la camara */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f, 1.5, 0.0, 300.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/** Se actualiza la posicion de la camara */
camera.updateLook();
camera.getPos(camera_pos);
camera.checkCollision(map.getScaledHeight((int)camera_pos[0], (int)camera_pos[2]), map.getSize());
/** Se dibuja la escena */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
map.render();
sky.render(); // Primero el heightmap y luego el skybox
glFlush();
glutSwapBuffers();
Como se puede ver en el código, se pinta primero el heightmap y luego el skybox. Con el uso del z-buffer esto debería dar igual y tendría que salir el heightmap bien dibujado y sin embargo pasa una cosa muy rara: se ven algunos píxeles del heightmap pero otros no, es como si para algunos píxeles no se estuviera haciendo correctamente el test del z-buffer. ¿Como es esto posible?. Agradecería algo de ayuda porque estoy un poco desconcertado. Gracias por adelantado.
El parametro znear de gluPerpective debe ser mayor que cero, y mientras mayor sea obtienes mejor precision en zbuffer. Recomendaria un valor entorno a 4 (si no recuerdo mal, es el que usa el quake2)
Vale eso era, muuchas gracias.