[Tutorial] II.1 - GLUT, y glutDisplayFunc()

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] II.1 - GLUT, y glutDisplayFunc()

Mensaje  HarZe el Vie Jul 17, 2009 8:32 pm

GLUT : Graphics Library Utilities Toolkit, no es lo más importante del OpenGL, pero es necesario para usar OpenGL fácilmente en cualquier sistema operativo.

Lo primero que hay que entender es que al usar GLUT, dentro de C, tienes que cambiar un poco la forma de entender el funcionamiento de los programas OpenGL que usan GLUT. A lo largo de los tutoriales lo iré explicando, no agobiarse, de momento diremos básicamente que ahora es OpenGL quien controla el programa, que deja de ser "lineal".

Los tutoriales a partir de aquí, según vayas avanzando, será más complejo el contenido, y será actualizado con cosas más complejas si aún las hay. Recomiendo primero leer todo, después practicar con lo básico de cada tuto, y luego ya experimentar con todo.

II.1 Un HelloWorld más completo:
Novedades:
  • glutInitDsiplay()
  • glutInitWindow...()
  • glutCreateWindow()
  • glutDisplayFunc()
  • glutReshapeFunc()
  • glutSwapBuffers()
  • glutMainLoop()

Código:
#include <GL/glut.h>

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica II,1 de OpenGL");
}

void Proyectar(int w, int h) {
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0,5,0,5,-1,1);
 
  glClearColor(0.0f,0.0f,0.6f,1.0f);
}

void PintarEscena() {
  glMatrixMode(GL_MODELVIEW);
  glClear(GL_COLOR_BUFFER_BIT);
 
  glColor3f(0.0f,0.0f,0.0f);
  glRectf(2.0f,1.0f,4.0f,3.0f);
 
  glColor3f(0.5f,0.5f,0.0f);
  glRectf(1.0f,2.0f,3.0f,4.0f);
 
  glutSwapBuffers();
}

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();
  Proyectar();
  glutDisplayFunc(PintarEscena);
  //glutReshapeFunc(Proyectar);
 
  glutMainLoop();
  return 0;
}



Analicemos el código primero como sería en el C que normalmente usas. Primero se ejecuta el contenido de IniciarGLUT(), que es algo que ya expliqué en el primer tutorial:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); Esta función indica cuántos y qué bufferes van a ser usados (se explicarán los bufferes más adelante), en este doble buffer y color RGB (RGBA). El doble buffer es un sistema para que el cálculo de cada nuevo fotograma no lleve un tiempo suficiente para provocar un molesto parpadea de la ventana, así, mientras uno se muestra, en el otro se hacen los cálculos.
glutInitWindowSize(500,500); Establece el tamaño inicial de la ventana
glutInitWindowPosition(100,100); Establece la posición inicial de la ventana
glutCreateWindow("Practica II,1 de OpenGL"); Se crea la ventana con las anteriores características, con el nombre indicado ahí.

Después pasamos a la función Proyectar(), que contiene funciones necesarias para el programa más básicos, pero que ya explicaré más adelante. Dejemoslo en que establece una proyección ortogonal (plana), de 5 unidades de ancho y 5 de alto.

Tampoco se basa en GLUT la función PintarEscena(), pero luego veremos como se relaciona con GLUT, de momento solo hay que decir que sirve para pintar en escena dos cuadrados, uno marrón y otro negro que parece su sombra, pero que simplemente está más abajo y marrón se le superpone. Si nos interesa glutSwapBuffers() que se usa para intercambiar los bufferes, provocando, al igual que glFlush(), para imprimir en pantalla la nueva escena.

Por útlimo en main(), vemos:
glutDisplayFunc(PintarEscena); Esta función es la que GLUT ejecutará cada vez que haya que redibujar el contenido
glutReshapeFunc(Proyectar); Esta función es la que GLUT ejecutará cada vez que la ventana cambie de tamaño
glutMainLoop(); Esta función provocará que todas las funciones GLUT que controlan funciones, se repitan cuando sea necesario, es decir, es un bucle inteligente, en otras palabras, es darle a GLUT el control sobre el programa, algo que no es muy común en las librerías típicas de C.

A glutReshapeFunc(Proyectar); le he puesto // de comentario, para que lo pruebes, y a la vez para que no lo pruebes. Que veas la diferencia de usarlo y no usarlo. Cuando no lo usas, si deformas la ventana, se deformará la imagen por defecto (algo puede intersarte), pero tenemos la glutReshapeFunc() para que cuando se deforme la ventana, pase "algo", ya sea que se deforme la imagen con la ventana, que se mantenga la imagen aunque se deje de ver parte (lo que pasa en este codigo si quitas las dos barras) o que se deforme de alguna forma especial, ya hablaremos de eso.


Última edición por HarZe el Jue Ago 12, 2010 12:20 am, editado 1 vez

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Una duda!Maestro

Mensaje  ken310 el Jue Jul 15, 2010 3:35 pm

Harze!Tengo problemas al descomentar el comentario y activar la funcion Reshape,me tira este error tanto en linux como en el fastidio de windows(mira que acerme entrar en windows! Laughing )

curso.cpp:37: error: invalid conversion from ‘void (*)()’ to ‘void (*)(int, int)’
curso.cpp:37: error: initializing argument 1 of ‘void glutReshapeFunc(void (*)(int, int))’

De donde viene?

ken310

Cantidad de envíos : 4
Fecha de inscripción : 15/07/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: [Tutorial] II.1 - GLUT, y glutDisplayFunc()

Mensaje  HarZe el Jue Ago 12, 2010 12:16 am

ken310 escribió:Harze!Tengo problemas al descomentar el comentario y activar la funcion Reshape,me tira este error tanto en linux como en el fastidio de windows(mira que acerme entrar en windows! Laughing )

curso.cpp:37: error: invalid conversion from ‘void (*)()’ to ‘void (*)(int, int)’
curso.cpp:37: error: initializing argument 1 of ‘void glutReshapeFunc(void (*)(int, int))’

De donde viene?

Perdona por tardar en responde, estaba en la playa sin internet xD

Lo que me dice esa línea es que la función que usas como argumento para glutReshapeFunc() no es válida. Tienes razón, la función Proyectar() necesita dos argumentos: int w y int h para que funcione. Ahora lo cambio.

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Re: [Tutorial] II.1 - GLUT, y glutDisplayFunc()

Mensaje  ken310 el Dom Oct 03, 2010 1:13 pm

Oye te puedes creer,que ahora el dev c++,me diice que la función Proyectar tiene "too few arguments" XD,luego lo pruebo en ubuntu..pero bueno..en fin Very Happy

ken310

Cantidad de envíos : 4
Fecha de inscripción : 15/07/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: [Tutorial] II.1 - GLUT, y glutDisplayFunc()

Mensaje  Contenido patrocinado Hoy a las 5:24 pm


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.