martes, 31 de enero de 2012

Los eventos importantes en la historia de la graficacion.


INTRODUCCION A LA COMPUTACION GRAFICA
En sus inicios las computadoras se utilizaban principalmente en aplicaciones científicas.
Una de las primeras computadoras, calculaba densidades de neutrón transversales para ver si explotaría la bomba de hidrógeno. Los resultados se reportaban por medio de dispositivos de impresión sencillos que producían secuencias de caracteres alfanuméricos que los usuarios debían examinar.

El siguiente paso en la evolución de las computadoras fue la creación de dispositivos de visualización que permitían al usuario de una computadora observar los resultados del procesamiento en el dispositivo.

Durante la década de los 50 también continuó el desarrollo de los dispositivos de entrada. El sistema para la defensa espacial SAGE, desarrollado para convertir los sonidos de detección de un radar en imágenes, fue el primero en emplear un lápiz óptico para seleccionar símbolos en la pantalla.

El primer videojuego de la historia fue creado en 1952, con el nombre de OXO. La enorme computadora EDSAC en la que se corría el juego fue la primera computadora electrónica capaz de almacenar programas. El juego aunque tenía un nivel de interacción solo permitía un jugador.

En 1963 cuando se creó el primer sistema que permitía la manipulación directa de objetos gráficos y fue el precursor de los sistemas modernos de gráficos por computadora y los programas de diseño asistido por computadora. El sistema permitía a los usuarios dibujar puntos, segmentos de líneas rectas y arcos circulares directamente sobre la pantalla mediante un lápiz óptico.

El Sketchpad inventado por Iván Sutherland fue el primer sistema interactivo de gráficos por computadora utilizado para aplicaciones de diseño e ingeniería.
 
 Muchas de las ideas demostradas por primera vez en el Sketchpad ahora son parte de entornos de computadoras usadas por millones en aplicaciones de investigación científica, negocios y recreación. Estas ideas incluyen:
 
 En 1968 Tektronix introdujo un CRT con tubo de almacenamiento que permitía retener permanentemente un dibujo hasta que el usuario decidiera borrarlo. Este sistema eliminó la necesidad de utilizar costosos sistemas especiales de hardware y memoria para redibujado.

En 1970 Edwin Catmull, vio las computadoras como la evolución natural de la animación y quería ser parte de esa revolución. La primera animación por computadora que Catmull vio fue de sí mismo. El creó una animación de su mano abriéndose y cerrándose. Se volvió uno de sus objetivos crear una película entera usando gráficos por computadora.

A partir de 1970 se comenzaron a introducir los gráficos por computadora en el mundo de la televisión.

Computer Image Corporation desarrollo sistemas complejos de hardware y software como ANIMAC, SCANIMATE y CAESAR. Todos esos sistemas funcionaban escaneando una imagen existente, para después manipularla, aplastándola, estirándola, girándola y haciéndola volar por la pantalla, etc.

Uno de los más importantes avances para los gráficos por computadora apareció en escena en 1971, el microprocesador. Usando tecnología de circuitos integrados desarrollada en 1959, la electrónica de un procesador de computadora fue reducida a un único chip, el microprocesador a veces llamado CPU.

En el mismo año Nolan Kay Bushnell junto con un amigo creo el Atari. Después de esto comenzó el desarrollo de un videojuego de arcadia llamado Pong, que se conoció en 1972 y comenzó una industria que continúa siendo hasta hoy una de las que mayor uso hace de los gráficos por computadora.

El juego se basaba en aquel creado en 1958 por William Higinbotham, quien programó un osciloscopio para que simulara una partida de ping-pong que permitía la interacción entre dos jugadores.

Durante la década de los 70’s Don Greenberg de la Universidad de Cornell creó un laboratorio de gráficos por computadora que produjo nuevos métodos de simulación realista de superficies. El programa de gráficos por computadora de Cornell es bien conocido por sus trabajos en síntesis de imágenes realistas, incluyendo el método de radiosidad para el cálculo de iluminación directa e indirecta en escenas sintéticas. El objetivo del laboratorio a largo plazo es desarrollar modelos de iluminación basados en física y procedimientos de rende rizado preceptúales que sean visual y cuantificablemente indistinguibles de imágenes del mundo real.

A finales de los 70’s Carpenter había construido modelos en 3D de diseños de aeroplanos y quería algunos escenarios para usarlos. 
En esa época se había estrenado Star Wars y siendo gran fan de la imaginación Carpenter soñó con crear algún tipo de paisaje extraterrestre. Esto lo condujo a hacerlo realmente; para 1979 tenía una idea de cómo crear un terreno fractal en animación.

En 1986 se formó Pixar cuando la división de gráficos por computadora de Lucas film fue adquirida por Steven Jobs.

El verano de 1994 trajo toda una gama de películas llenas de gráficos por computadora. Algunos efectos sin embargo, eran tan foto realistas que el uso de la computadora era indetectable. Por ejemplo en la película Forrest Gump, los artistas usaron composición digital, sobreponiendo distintas secuencias de video una encima de otra, produciendo la ilusión de que el actor Tom Hanks estaba en la misma escena con algunos famosos políticos americanos como John F. Kennedy.

 En 1995 se presentó la primera película de larga duración con gráficos y animaciones 3D por computadora. La película realizada por Pixar fue llamada Toy Story 
Para 1995 las audiencias de todo el mundo estaban acostumbradas a ver asombrosos gráficos en películas, pero hubo otra revolución de gráficos, que comenzó ese año. Sony lanzó al mercado mundial su consola de juegos Playstation.

En 1997 la industria de los videojuegos experimentó una revolución, esta vez fue el acelerador 3DFX Voodoo 3D. Este chip 3D aplastó por completo a la competencia con su increíble y extremadamente práctico desempeño en 3D.

1999 fue probablemente el año más excitante para los video jugadores de todo el mundo. nVidia finalmente logró superar el desempeño de 3DFX en la batalla de los chips 3D con su procesador TNT2. Ni siquiera la Voodoo 3 podría igualar al chip TNT2.

En el 2000 el mundo de la cinematografía se vio beneficiado con avances y se puede ver en películas como Final Fantasy: The Spirits Within, tal vez el primer intento verdadero por crear humanos realistas en una película completamente generada por computadora.
Durante 2003 aparecieron varias secuelas cinematográficas con grandes efectos especiales. X-Men 2, Matrix 2 y Terminator 3 son solo algunos ejemplos. Matrix Revolutions presentó una gran cantidad de asombrosos efectos especiales.

Para la película Spider-Man 3 de 2007 Sony Pictures Image works usó el software Autodesk Maya para la animación en 3D, el modelado, texturizado y combinación de movimientos de los personajes y efectos visuales aproximadamente en 80% de las tomas realizadas por el estudio. Se usó el sistema de efectos visuales Autodesk Flame para hacer cambios en el rostro de los personajes y para integrar tomas reales de ellos en ambientes generados totalmente por computadora. 

EL HARDWARE GRAFICO
Un sistema gráfico tradicional consta de cuatro componentes: procesador, unidad de procesamiento gráfico, dispositivos de entrada y dispositivos de salida. El procesador desempeña un papel central en cualquier sistema gráfico y cada uno de los demás componentes debe comunicarse en algún momento con otro, o con el procesador mediante un canal de datos.

Generalmente el dispositivo principal de salida de un sistema gráfico es un monitor de video. Uno de los componentes de un monitor de video CRT es el cañón de electrones; el cañón tiene un cátodo que al calentarse emite un haz de electrones que pasa a través de los sistemas de enfoque y desviación que dirigen el haz hacia una posición específica de la pantalla que se encuentra recubierta con una película de fósforo con carga positiva, de modo que al impactar el rayo de electrones en un punto de la cubierta de fósforo esta emite luz durante una fracción de segundo. El sistema de desviación consta de un par de placas metálicas horizontales y un par de verticales. Al pasar los electrones del haz entre cada par de placas, el campo eléctrico generado entre estas produce una desviación en el haz, primero en dirección vertical y después horizontal.

La pantalla de video que utilizan la mayoría de las microcomputadoras se dividen en pequeños puntos. Cada uno de esos puntos se denomina pixel.

Un pixel es la unidad mínima de representación gráfica. La resolución de una presentación por barrido es un indicador de su calidad gráfica y se determina por el número de pixeles por unidad de área.

Cuando hablamos de mejor resolución gráfica, hablamos de usar un número mayor de líneas de barrido (horizontales) con mayor número de píxeles.

La resolución y el concepto de una malla de áreas de colores son análogos a un mosaico. En tal forma de arte, un mosaico intenta representar una imagen a partir de azulejos pequeños de determinados colores y tonos.

En un sistema de barrido se presenta la imagen por medio de una secuencia predefinida y cíclica. El haz de electrones que ha sido desviado por las placas de deflexión choca contra la esquina superior izquierda de la pantalla recubierta de fósforo produciendo luminiscencia en ese punto. En los monitores a color, cada punto o pixel de la pantalla está compuesto por tres pequeños puntos de fósforo: rojo, azul y verde.

Después de que el haz de electrones ha iluminado el primer punto de la pantalla, la tensión de las placas de deflexión cambia continuamente, guiando al haz de electrones sobre la línea de barrido de izquierda a derecha. Cuando se llega al final de la línea el cañón de electrones se apaga y la tensión de las placas sea justa para desviar el haz al inicio de la segunda línea de barrido; este proceso se conoce como retorno horizontal. Se continúa repasando cada línea de barrido de la pantalla y cuando se ha llegado al extremo derecho de la última línea de barrido se ha completado un cuadro. Al final de cada cuadro el haz de electrones sea paga y regresa a la esquina superior izquierda para iniciar el cuadro siguiente; a esto se le llama retorno vertical.

 El proceso de barrido es tan rápido que el ojo humano no es capaz de distinguir como se activan los puntos por separado, percibiendo la ilusión de que todos los pixeles se activan al mismo tiempo. El proceso de barrido generalmente se divide en dos fases, cada una con una duración de 1/60 de segundo. En la primera fase se despliegan las líneas de barrido numeradas impares y, en la segunda, las líneas pares. El resultado de este ciclo de refresco entrelazado es una reducción del efecto de parpadeo con un tiempo de cuadro de 1/30 de segundo. 

Cuando se despliega una imagen en la pantalla de un monitor de video, se necesita iluminar solo los pixeles adecuados. La iluminación de los pixeles apropiados requiere una unidad de presentación que consta de dos partes: memoria de video y controlador de video.
En ese esquema se hace un uso más eficiente de la memoria ya que se destina la memoria de video destinada al almacenamiento de copias de la imagen a desplegarse en pantalla es independiente de la memoria principal del sistema.

La memoria de video almacena el resultado de las funciones gráficas. Cada pixel en pantalla corresponde a una entrada particular en un arreglo bidimensional en memoria. Algunos sistemas gráficos cuentas con una memoria de video diferente de la memoria principal. El número de renglones en el arreglo de la memoria de video es igual al número de líneas de barrido en la pantalla, así el número de columnas en este arreglo es igual al número de pixeles en cada línea de barrido. El término pixel se usa también para describir el renglón y la columna de colocación en el arreglo de la memoria de video que corresponda a la posición en pantalla.

 Si se quiere desplegar un pixel en pantalla, se coloca un valor específico en la localidad de memoria correspondiente en el arreglo de la imagen. Se accede a cada posición de pixel en pantalla y su correspondiente localidad en la memoria de video por medio de un par coordenado entero (x, y). El valor de x se refiere a la columna, mientras que el valor de y representa la posición del renglón. Por lo general, el origen de este sistema de coordenadas aparece en la esquina inferior izquierda aunque la imagen continúe desplegándose en el mismo orden que las líneas de barrido, de arriba abajo.

El controlador de video es un dispositivo de hardware que lee el contenido de la memoria de video y lo deposita en un buffer de video, para luego convertir la representación digital de una cadena de valores de pixeles en señales analógicas de tensión que se envían en serie a la pantalla de video.

El usuario de un sistema gráfico se comunica con el programa por medio de ciertos dispositivos de entrada y obtiene los resultados en los dispositivos de salida.

El hardware gráfico también incluye a las tarjetas gráficas. Una tarjeta gráfica o tarjeta de video, es una tarjeta de expansión para una computadora encargada de procesar los datos provenientes de la CPU y transformarlos en información comprensible y representable en un dispositivo de salida, como un monitor o televisor.

EL SOFTWARE GRAFICO
Una representación gráfica consisten en un conjunto de pixeles que se obtiene a partir de una idea de más alto nivel; como puede ser la descripción de la gráfica en términos de líneas, arcos, colores etc. o incluso en términos de objetos tridimensionales, puntos de vista e iluminación.

El cómo llegar de estas descripciones de alto nivel al conjunto de pixeles final es algo de lo que las diferentes partes del sistema se deberán encargar; por lo general el programador dispone de una serie de librerías de programación gráfica que le permiten escribir aplicaciones sin tener que llegar a conocer en detalle el hardware sobre el que se ejecutará su código, y sin tener que escribir desde el principio miles de procedimientos que, además, distan de ser triviales.

Por lo general, estas librerías permiten trabajar creando estructuras en un sistema de coordenadas local, integrar estas estructuras en una escena más compleja que utiliza un sistema de coordenadas global o "de mundo". De algún modo, el software transformará estas coordenadas a unas coordenadas de dispositivo normalizado (independiente de las características físicas del dispositivo real) y en un último paso estas se ajustarán al rango de salida del dispositivo final.

OpenGL
OpenGL es una API portable para desarrollar aplicaciones gráficas interactivas 2D y 3D. Fue desarrollada por Silicon Graphics y actualmente es un estándar abierto controlado por diversas compañías. Su mayor ventaja es su portabilidad, es decir que puede ser usada en una gran cantidad de plataformas de hardware, desde dispositivos móviles hasta súper computadoras, además de distintos sistemas operativos y tarjetas aceleradoras 3D. Es relativamente fácil de usar.

Direct3D
Direct3D es parte de DirectX, una API propiedad de Microsoft disponible tanto en los sistemas Windows de 32 y 64 bits, como para sus consolas Xbox y Xbox 360  para la programación de gráficos 3D.

El objetivo de esta API es facilitar el manejo y trazado de entidades gráficas elementales, como líneas, polígonos y texturas, en cualquier aplicación que despliegue gráfico en 3D, así como efectuar de forma transparente transformaciones geométricas sobre dichas entidades.
Direct3D provee también una interfaz transparente con el hardware de aceleración gráfica. Se usa principalmente en aplicaciones donde el rendimiento es fundamental, como los videojuegos, aprovechando el hardware de aceleración gráfica disponible en la tarjeta gráfica.

lunes, 30 de enero de 2012

ACTIVIDAD #4


APLICACIONES DE GRÁFICOS DE COMPUTADORA
Es el arte o la ciencia de producir imágenes graficas con la ayuda de computadora


Despliegue de información.- 
Todas las computadoras necesitan de un componente de hardware para poder desplegar gráficos.
Existen dos componentes básicos para el despliegue de gráficos: la tarjeta de video y el monitor.
Las tarjetas de video es la parte encargada de realizar todas el procesamiento de información que conllevan los SG. Dichas tarjetas pueden ser internas o externas. Generalmente se recomiendan que sean externas y que utilicen buses especiales de comunicación (AGP) para transmitir la información de manera eficiente.
El uso de Sistemas Operativos gráficos, videojuegos, procesos de simulación, etc. han fortalecido el uso de dispositivos de despliegue gráfico.
Las tarjetas de video definen su capacidad en la resolución (tamaño de la pantalla). Por ejemplo el estándar UXVGA procesa gráficos en dimensiones de 1600x1200 pixeles (puntos por pantalla) a 16 millones de colores.


DISEÑO.-
Se define como el proceso previo de configuración mental, "pre-figuración", en la búsqueda de una solución en cualquier campo.
S
SIMULACION Y ANIMACION.-
Estos programas producen un efecto de movimiento de las figuras representadas.
Los programas de animación pretenden crear efectos artísticos  (su movimiento es libre)
Los programas de simulación pretenden crear un efecto real (movimiento limitado)
En el diseño de objetos se utilizan programas de simulación para conseguir realismo en las piezas diseñadas de tal manera que las limitaciones de movimiento  permitan tratar los objetos diseñado con otros programas de ensayos virtuales


INTERFACES DE USUARIO
La interfaz de usuario es el medio con que el usuario puede comunicarse con una máquina, un equipo o una computadora, y comprende todos los puntos de contacto entre el usuario y el equipo. Normalmente suelen ser fáciles de entender y fáciles de accionar.

SISTEMA DE GRÁFICOS
PROCESADOR
El procesador (CPU, por Central Processing Unit o Unidad Central de Procesamiento), es por decirlo de alguna manera, el cerebro del ordenador. Permite el procesamiento de información numérica, es decir, información ingresada en formato binario, así como la ejecución de instrucciones almacenadas en la memoria. 
El primer microprocesador (Intel 4004) se inventó en 1971. Era un dispositivo de cálculo de 4 bits, con una velocidad de 108 kHz. Desde entonces, la potencia de los microprocesadores ha aumentado de manera exponencial. ¿Qué son exactamente esas pequeñas piezas de silicona que hacen funcionar un ordenador? 

Funcionamiento
El procesador (denominado CPU, por Central Processing Unit) es un circuito electrónico que funciona a la velocidad de un reloj interno, gracias a un cristal de cuarzo que, sometido a una corriente eléctrica, envía pulsos, denominados "picos". La velocidad de reloj (también denominada ciclo), corresponde al número de pulsos por segundo, expresados en Hertz (Hz). De este modo, un ordenador de 200 MHz posee un reloj que envía 200.000.000 pulsos por segundo. Por lo general, la frecuencia de reloj es un múltiplo de la frecuencia del sistema (FSB, Front-Side Bus o Bus de la Parte Frontal), es decir, un múltiplo de la frecuencia de la placa madre
Con cada pico de reloj, el procesador ejecuta una acción que corresponde a su vez a una instrucción o bien a una parte de ella. La medida CPI (Cycles Per Instruction o Ciclos por Instrucción) representa el número promedio de ciclos de reloj necesarios para que el microprocesador ejecute una instrucción. En consecuencia, la potencia del microprocesador puede caracterizarse por el número de instrucciones por segundo que es capaz de procesar. Los MIPS (millions of instructions per second o millones de instrucciones por segundo) son las unidades que se utilizan, y corresponden a la frecuencia del procesador dividida por el número 
de CPI.


MEMORIA
 La memoria (también llamada almacenamiento) se refiere a parte de los componentes que forman parte de una computadora. Son dispositivos que retienen datos informáticos durante algún intervalo de tiempo. Las memorias de computadora proporcionan una de las principales funciones de la computación moderna, la retención o almacenamiento de información. Es uno de los componentes fundamentales de todas las computadoras modernas que, acoplados a una unidad central de procesamiento, En la actualidad, memoria suele referirse a una forma de almacenamiento de estado sólido conocido como memoria RAM y otras veces se refiere a otras formas de almacenamiento rápido pero temporal. De forma similar, se refiere a formas de almacenamiento masivo como discos ópticos y tipos de almacenamiento magnético como discos duros y otros tipos de almacenamiento más lentos que las memorias RAM, pero de naturaleza más permanente. Estas distinciones contemporáneas son de ayuda porque son 
fundamentales para la arquitectura de computadores en general.


 FRAME BUFFER
Es la porción de memoria (buffer) reservada para mantener temporalmente una imagen ráster (frame) a la espera de ser enviada al monitor o a un dispositivo. Es usado para compensar las diferentes tasas de flujo de datos entre los componentes de una computadora.

Generalmente el framebuffer utiliza chips de memoria en el adaptador de video para almacenar su contenido. De todas maneras en algunos casos el adaptador de video está integrado a la placa madre y el frame buffer es por lo tanto almacenado en la memoria principal (RAM).

El framebuffer es la parte del sistema de video en donde una imagen es almacenada píxel por píxel y es usado para refrescar una imagen láster.
ttp://www.alegsa.com.ar/Dic/framebuffer.php

DISPOSITIVO DE SALIDA
Es aquel que emite una señal con información. En este sentido podemos mencionar a la impresora (que recibe información de unacomputadora y produce una salida impresa en 
 papel), el monitor (exhibe los datos en la pantalla), los auriculares (emite sonidos para que 
 sean escuchados por una persona) y el altavoz (reproduce sonidos al ambiente).


DISPOSITIVOS DE ENTRADA

Son las herramientas utilizadas para ingresar todo tipo de datos a la computadora. Las entradas son las señales recibidas por la unidad, y se pueden definir como los medios a través de los cuales una persona o sistema para comunicarse con la computadora.


DISPARIDAD BINOCULAR
Es la diferencia entre las imágenes percibidas por la retina izquierda y derecha de nuestros ojos debido a la separación de 7 cm entre ellas.
El cerebro ingresa estas dos imágenes en una sola imagen tridimensional, permitiéndonos percibir profundidad y distancia. Sin embargo, esto es cierto solo para distancias menores a 3 cm.


 INFORMACIÓN MONOCULAR
·         Información monocular
·         Interposición
·         Perspectiva atmosférica
·         Gradiente de textura
·         Perspectiva lineal
·         Tamaño 
·         Altitud
·         Movimiento relativo

viernes, 27 de enero de 2012

OPENGL

¿Qué es OPENGL? 

 Es una especificación estándar que define una API multilenguaje y multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D. La interfaz consiste en más de 250 funciones diferentes que pueden usarse para dibujar escenas tridimensionales complejas a partir de primitivas geométricas simples, tales como puntos, líneas y triángulos. Fue desarrollada en 1992.

Como instalar las librerías 
  1. Descarga el archivo con las librerias y cabeceras
  2. copia la carpeta GL en la carpeta del visual studio ..\DevStudio\VC98\include\gl
  3. Haz lo mismo con la carpeta lib en ..\DevStudio\VC98\lib
  4. Y el contenido de la carpeta system32 del zip en windows\system32

Probar el siguiente codigo
/*cubetex.c           */ 
/* Rotating cube with texture mapping */
/* mouse buttons control direction of
/* rotation, keyboard allows start/top/quit */
/* E. Angel, Interactive Computer Graphics */
/* A Top-Down Approach with OpenGL, Third Edition */
/* Addison-Wesley Longman, 2003 */
#include <stdlib.h>
#include <GL/glut.h>
GLfloat planes[]= {-1.0, 0.0, 1.0, 0.0};
GLfloat planet[]= {0.0, -1.0,  0.0, 1.0};
 GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
 {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},
 {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};
 GLfloat colors[][4] = {{0.0,0.0,0.0,0.5},{1.0,0.0,0.0,0.5},
 {1.0,1.0,0.0,0.5}, {0.0,1.0,0.0,0.5}, {0.0,0.0,1.0,0.5},
 {1.0,0.0,1.0,0.5}, {1.0,1.0,1.0,0.5}, {0.0,1.0,1.0,0.5}};
void polygon(int a, int b, int c , int d)
{
/* draw a polygon via list of vertices */
  glBegin(GL_POLYGON);
 glColor4fv(colors[a]);
 glTexCoord2f(0.0,0.0);
 glVertex3fv(vertices[a]);
 glColor4fv(colors[b]);
 glTexCoord2f(0.0,1.0);
 glVertex3fv(vertices[b]);
 glColor4fv(colors[c]);
 glTexCoord2f(1.0,1.0);
 glVertex3fv(vertices[c]);
 glColor4fv(colors[d]);
 glTexCoord2f(1.0,0.0);
 glVertex3fv(vertices[d]);
 glEnd();
                          }
void colorcube(void)
{
/* map vertices to faces */
 polygon(0,3,2,1);
 polygon(2,3,7,6);
 polygon(0,4,7,3);
 polygon(1,2,6,5);
 polygon(4,5,6,7);
 polygon(0,1,5,4);
}
static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2;
void display(void)
{
/* display callback, clear frame buffer and z buffer,
   rotate cube and draw, swap buffers */
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 glRotatef(theta[0], 1.0, 0.0, 0.0);
 glRotatef(theta[1], 0.0, 1.0, 0.0);
 glRotatef(theta[2], 0.0, 0.0, 1.0);
 colorcube();
 glutSwapBuffers();
}
void spinCube()
{
/* Idle callback, spin cube 2 degrees about selected axis */
 theta[axis] += 2.0;
 if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
 glutPostRedisplay();
}
void mouse(int btn, int state, int x, int y)
{
/* mouse callback, selects an axis about which to rotate */
 if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
 if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
 if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}
void myReshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
            2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
    else
        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
            2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
}
void key(unsigned char k, int x, int y)
{
 if(k == '1') glutIdleFunc(spinCube);
 if(k == '2') glutIdleFunc(NULL);
 if(k == 'q') exit(0);
}
void
main(int argc, char **argv)
{
   GLubyte image[64][64][3];
   int i, j, r, c;
   for(i=0;i<64;i++)
   {
     for(j=0;j<64;j++)
     {
       c = ((((i&0x8)==0)^((j&0x8))==0))*255;
       image[i][j][0]= (GLubyte) c;
       image[i][j][1]= (GLubyte) c;
       image[i][j][2]= (GLubyte) c;
     }
   }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("colorcube");
/* need both double buffering and z buffer */
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
   glutIdleFunc(spinCube);
   glutMouseFunc(mouse);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_TEXTURE_2D);
   glTexImage2D(GL_TEXTURE_2D,0,3,64,64,0,GL_RGB,GL_UNSIGNED_BYTE, image);
   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
   glutKeyboardFunc(key);
   glClearColor(1.0,1.0,1.0,1.0);
   glutMainLoop();
}