/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Compilando ejemplo OpenGL. Error lógico

 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 1344

MensajePublicado: 25/06/2011 9:57 am
Título: Compilando ejemplo OpenGL. Error lógico

Aprovecharé que, si no recuerdo mal, había algun forero que sabía de OpenGL para poner exponer mi primer problema con esta librería gráfica antes de programar nada.

Simplemente he tomado un código excesivamente comentado que me he encontrado en un manual y lo he compilado.
Código:

#include <GL/glut.h>

#define ANCHO 400
#define ALTO  400

/* Coordenada X del origen de la ventana, esquina superior izquierda */
#define ORIGENX 100
/* Coordenada Y del origen de la ventana, esquina superior izquierda */
#define ORIGENY 100

/* Parámetros iniciales del programa. */
void inicio(void)
{
   /* Activamos la matriz de proyección. */
   glMatrixMode(GL_PROJECTION);
   /* "Reseteamos" esta con la matriz identidad. */
   glLoadIdentity();
   /* Plano de proyección igual a la ventana de visualización.
    *Volumen de visualización desde z=-10 hasta z=10. */
   glOrtho(0, ANCHO, 0, ALTO, -10, 10);
   /* Activamos la matriz de modelado/visionado. */
   glMatrixMode(GL_MODELVIEW);
   /* La "reseteamos". */
   glLoadIdentity();
   /* Nos trasladamos al centro de nuestra ventana donde siempre
    * dibujaremos el polígono. Nos mantenemos en el plano z=5 que
    * se encuentra dentro del volumen de visualización. */
   glTranslatef( ANCHO/2.0, ALTO/2.0, 5.0);
   /* Color de fondo para la ventana de visualización, negro. */
   glClearColor( 0.0, 0.0, 0.0, 0.0);

}

/* OpenGL llamara a esta rutina cada vez que tenga que dibujar de
 * nuevo. Dado que rellenara el polígono de color y cada vértice
 * es de un color diferente, OpenGL rellenara el interior con una
 * interpolación de los colores de los 4 vértices. Lo hace automá-
 * ticamente. */
void dibujar(void)
{
   /* "Limpiamos" el frame buffer con el color de "Clear" en este
    * caso negro */
   glClear(GL_COLOR_BUFFER_BIT);
   /* Queremos que se dibujen las caras frontales de los polígonos y
    * con relleno de color. */
   glPolygonMode(GL_FRONT, GL_FILL);
   glBegin(GL_POLYGON);
      /* Color azul para el primer vértice */
      glColor3f(0.0, 0.0, 1.0);
      glVertex3i(-100, -100, 5);
      /* Color verde para el segundo vértice */
      glColor3f(0.0, 1.0, 0.0);
      glVertex3i(-100, 100, 5);
      /* Color rojo para el tercer vértice */
      glColor3f(1.0, 0.0, 0.0);
      glVertex3i(100, 100, 5);
      /* Color amarillo para el cuarto vértice */
      glColor3f(1.0, 1.0, 0.0);
      glVertex3i(100, -100, 5);
   glEnd();
}


int main(int argc, char **argv)
{
/* Primera llamada siempre en OpenGL, por si usáramos la línea
 * de comandos */
   glutInit( &argc, argv);
   //glutInit(&argc, argv);
   /* Activamos buffer simple y colores del tipo RGB */
   glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);
   /* Definimos una ventana de medidas ANCHO x ALTO como ventana
    * de visualización */
   glutInitWindowSize( ANCHO, ALTO);
   /* Posicionamos la esquina superior izquierda de la ventana
    * en el punto definido */
   glutInitWindowPosition( ORIGENX, ORIGENY );
   /* Creamos literalmente la ventana y le adjudicamos el nombre
    * que se observara en su barra de titulo */
   glutCreateWindow("Cuadrado Multicolor");

   /* Inicializamos el sistema */
   inicio();

   /* Hacemos saber a OpenGL que cada vez que sea necesario dibujar
    * de nuevo, por ejemplo la primera vez, o al redimensionar la
    * ventana con el ratón o en caso de provocar un "redibujado" por
    * programa, debe llamar a la función "dibujar". */
   glutDisplayFunc(dibujar);

   /* Aquí espera el programa mientras nada ocurra, es un Loop
    * infinito que se vera turbado por las sucesivas veces que
    * sea necesario redibujar. */
   glutMainLoop();

   return 0;
}


El problema es que al compilarlo y ejecutarlo no me sale el cuadrado multicolor que pensaba que debería salir. Lo que sale es una ventana con un fondo idéntico a las ventanas que tengo abiertas en el espacio de trabajo.

Decir que estoy usando Ubuntu 10.10. He instalado libglut3-dev libgl1-mesa-dev y libglu1-mesa-dev. Y que compilo con gcc de la siguiente manera:
Código:
gcc prov.c -o prov -lglut


Continuando explicando el problema pasa una cosa muy curiosa. Si yo agito la ventana abierta por el programa durante un rato la pantalla acaba tomando el aspecto de una sopa de letras. Si luego pulso para cerrar la ventana aparece el cuadrado multicolor sobre fondo negro por unos instantes antes de que se cierre la ventana. Supongo que se deberá a que agitando la ventana le he tocado mucho las narices a glutDisplayFunc() de manera que llama muchas veces a dibujar() y se ve. Lo que no entiendo es porque no se ve desde un principio.

Un saludo!
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 30/06/2011 1:42 am
Título:

Buenas.
Tal vez hayas notado que falta una llamada a glFlush en la func. dibujar().
Lo interesante de GLUT es que si no se utiliza doble buffer, como en éste caso GLUT_SINGLE, se puede igualmente usar glutSwapBuffers, porque implícitamente llama a glFlush(en realidad la impl. para Linux es glXSwapBuffers quién lo hace), aunque la doc. dice que no tiene efecto con GLUT_SINGLE.
Entonces usar glFlush para GLUT_SINGLE y glutSwapBuffers con GLUT_DOULBE.

Saludos.
Volver arriba
Dirección AIM
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com