/* * * Programa de prueba para el taller de OpenGL básico * * Este programa puede ser modificado, redistribuido y utilizado * para cualquier fin por cualquier persona. * * Se compila con el comando: gcc -lGL -lSDL glmain.c -o glmain.out * desde una terminal. * * Una vez compilado, se corre con el comando: ./glmain.out * * Se necesita tener instalados los archivos de desarrollo de MESA (OpenGL) * y SDL. * * En Debian y Ubuntu GNU/Linux, estos paquetes aparecen como * * libgl1-mesa-dev * * y * * libsdl1.2-dev * * También se necesita el compilador de la GNU, GCC, el cuál aparece como * * gcc * */ // Archivos de cabecera necesarios #include #include // Funciones de OpenGL #include // Funciones de SimpleDirectMedia Layer // Función principal del programa int main(int argc, char ** argv) { // Esta será nuestra superficie de dibujado SDL_Surface * video_surface; int no_salir = 1; SDL_Event controles; // Inicializar el sistema de video de SDL SDL_Init(SDL_INIT_VIDEO); // Crear la ventana video_surface = SDL_SetVideoMode(800, // Ancho 600, // Alto 0, // Densidad de color default SDL_OPENGL | SDL_HWSURFACE | SDL_DOUBLEBUF // Queremos OpenGL y que la superficie esté en hardware // (normalmente es más rápido en hardware). // Queremos también doble buffer para evitar // que la pantalla parpadee en algunos casos. ); // Establecer el color de fondo glClearColor(0.0, 0.0, 0.3, 0.0); // El valor default para reiniciar el buffer de profundidad glClearDepth(1.0); // Solicitar un buffer de profundidad de 24 bits SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); // Habilitar la función de prueba de profundidad glEnable(GL_DEPTH_TEST); // Establecer la función de prueba de profundidad glDepthFunc(GL_LESS); // Terminar de establecer la función de prueba de profundidad glDepthMask( GL_TRUE ); // Establecer el puerto de vista glViewport (1, // x inicial (en pixels) 1, // y inicial (en pixels) 800, // ancho 600 // alto ); // Establecer "proyección" como la matriz actual glMatrixMode(GL_PROJECTION); // Reiniciar la matriz actual glLoadIdentity (); // Establecer la pirámide truncada que define la vista glFrustum (-1.0, // X mínima 1.0, // X máxima -1.0, // Y mínima 1.0, // Y máxima 0.5, // Z mínima 1000.0 // Z máxima ); // Cambiar la matriz actual a la matriz de vista del modelo glMatrixMode(GL_MODELVIEW); while( no_salir) { SDL_PollEvent(&controles); if (controles.type == SDL_QUIT) no_salir = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glBegin(GL_TRIANGLES); glVertex3f(0.5, 0.5, -2); glVertex3f(-0.5, 0.5, -2); glVertex3f(0.0, -0.5, -2); glEnd(); SDL_GL_SwapBuffers(); SDL_Delay(16); } return 0; }