2007/10/15
Circulo de Bresenham
Implementar el algoritmo de Bresenham en OpenGL, marcando cada octante de diferente color. Añadir el círculo que están aproximando para comparar los resultados proporcionados por el algoritmo.
Código
2007/10/02
Previo Practica 7
Previo práctica 7
1.- ¿Qué es "shading" (sombreado) en términos de computacion gráfica?
En computación grafica "Shading" se refiere al proceso de alterar el color basado en el angulo y la distancia en que una fuente de luz reside en un objeto, creando un efecto realista.
2.- ¿Qué es y cómo se declara y usa en OpenGL/Glut
-Una fuente de luz
Proporciona una fuente de luz a nuestra escena para iluminarla
Se necesitan declarar la posisión componentes e intensidad de las luces declaradas como sigue:
glEnable(GL_LIGHTING); //Habilita luces
glDepthFunc(GL_LESS); //Tipo de Pruebas de profundidad
glEnable(GL_DEPTH_TEST); //Habilita Pueba de Profundidad
glFrontFace(GL_CCW); //Cara posterior de poligonos sentido contrahorario
GLfloat ambientLight[] = { 0.05, 0.05, 0.05, 1.0 };
GLfloat diffuseLight[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat specularLight[] = { 0.7, 0.7, 0.7, 1.0 };
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight );
glLightfv( GL_LIGHT0, GL_SPECULAR, specularLight );
glEnable( GL_LIGHT0 );//Habilita luz 0
-Un material
Es la reacción que va a tener nuestra materia en la escena hacia la luz
Se requiere declarar cual va a ser el comportamiento de dicho material con respecto a la luz como sigue:
float tKa[]= {X.xx,X.xx,X.xx,X.xx};
float tKd[]= {X.xx,X.xx,X.xx,X.xx};
float tKs[]= {X.xx,X.xx,X.xx,X.xx};
glMaterialfv(GL_FRONT, GL_AMBIENT, tKa);//Refracción de luz ambiente
glMaterialfv(GL_FRONT, GL_DIFFUSE, tKd);//Refracción de luz difusa
glMaterialfv(GL_FRONT, GL_SPECULAR, tKs);//Refracción de luz especular
glMaterialf (GL_FRONT, GL_SHININESS, int);//Brillo valor entero entre 0 y 128
-Una textura
Cubrir un poligono con alteraciones podria resultar muy costoso al procesador, hay casos en los que no es tan necesario hacer alteraciones dado que estas pueden ser representadas por imagenes, es como envolver una caja con papel de regalo, la caja sigue siendo la misma, pero el adorno fué mas economico que hacerle un grabado al cartón.
Se necesita un cargador de texturas para abrir un archivo de imagen, segun el tipo de archivo que queremos abrir es el tipo de cargador que necesitamos, esto coloca un apuntador a imagen y proseguimos a asociar los vertices de esa imagen a un plano como sigue en el ejemplo, en este caso yo utilice el cargadór de imagenes bmp de Chris Backhouse, bajo la licencia GNU:
BMPLoad("texturas/LABS.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,
GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
3.- ¿Cuáles son los atributos/caracteristicas que se pueden declarar en Open/GLUT para manejo de:
-Luces
Las caracteristicas expresadas arriba, el tipo de luz ambiente, especular o difusa.
-Materiales
La manera en la que va a reflejar la luz recibida, de que manera debe de ser interpretada.
-Texturas
La forma de aplicar el material al poligono donde se encuentre pegado, puede ser modular, reemplazar, calcomania o fundido.
4.- Escriba un programa donde:
-Dibuje un cubo y asigne características de material que lo hagan verse como de madera
-Aplique una textura de madera al cubo (bitmap)
-Aplique como textura su fotografía
El cambio de modo se hará con un click del mouse
void CuboDePractica (void){
if (practica.cambiaCubo >= 3)
practica.cambiaCubo = 0;
printf("cambiacubo: %d\n",practica.cambiaCubo);
Material(0);
BMPClass bmp;
if (practica.cambiaCubo == 0){
Material (13);
glDisable(GL_TEXTURE_2D);
}
if (practica.cambiaCubo == 1){
BMPLoad("texturas/madera.bmp",bmp);
glEnable(GL_TEXTURE_2D);//se activa el mapeado de texturas
}
if (practica.cambiaCubo == 2){
glEnable(GL_TEXTURE_2D);//se activa el mapeado de texturas
}
glPushMatrix();//Despliegue del cubo con imagenes
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo1.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,1.0);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo2.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,-1.0);
glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f( 0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo3.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(-1.0,0.0,0.0);
glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo4.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(1.0,0.0,0.0);
glTexCoord2f(0.0,1.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f( 0.5,-0.5,-0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo5.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f( 0.5,0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/LABS.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
}
1.- ¿Qué es "shading" (sombreado) en términos de computacion gráfica?
En computación grafica "Shading" se refiere al proceso de alterar el color basado en el angulo y la distancia en que una fuente de luz reside en un objeto, creando un efecto realista.
2.- ¿Qué es y cómo se declara y usa en OpenGL/Glut
-Una fuente de luz
Proporciona una fuente de luz a nuestra escena para iluminarla
Se necesitan declarar la posisión componentes e intensidad de las luces declaradas como sigue:
glEnable(GL_LIGHTING); //Habilita luces
glDepthFunc(GL_LESS); //Tipo de Pruebas de profundidad
glEnable(GL_DEPTH_TEST); //Habilita Pueba de Profundidad
glFrontFace(GL_CCW); //Cara posterior de poligonos sentido contrahorario
GLfloat ambientLight[] = { 0.05, 0.05, 0.05, 1.0 };
GLfloat diffuseLight[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat specularLight[] = { 0.7, 0.7, 0.7, 1.0 };
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight );
glLightfv( GL_LIGHT0, GL_SPECULAR, specularLight );
glEnable( GL_LIGHT0 );//Habilita luz 0
-Un material
Es la reacción que va a tener nuestra materia en la escena hacia la luz
Se requiere declarar cual va a ser el comportamiento de dicho material con respecto a la luz como sigue:
float tKa[]= {X.xx,X.xx,X.xx,X.xx};
float tKd[]= {X.xx,X.xx,X.xx,X.xx};
float tKs[]= {X.xx,X.xx,X.xx,X.xx};
glMaterialfv(GL_FRONT, GL_AMBIENT, tKa);//Refracción de luz ambiente
glMaterialfv(GL_FRONT, GL_DIFFUSE, tKd);//Refracción de luz difusa
glMaterialfv(GL_FRONT, GL_SPECULAR, tKs);//Refracción de luz especular
glMaterialf (GL_FRONT, GL_SHININESS, int);//Brillo valor entero entre 0 y 128
-Una textura
Cubrir un poligono con alteraciones podria resultar muy costoso al procesador, hay casos en los que no es tan necesario hacer alteraciones dado que estas pueden ser representadas por imagenes, es como envolver una caja con papel de regalo, la caja sigue siendo la misma, pero el adorno fué mas economico que hacerle un grabado al cartón.
Se necesita un cargador de texturas para abrir un archivo de imagen, segun el tipo de archivo que queremos abrir es el tipo de cargador que necesitamos, esto coloca un apuntador a imagen y proseguimos a asociar los vertices de esa imagen a un plano como sigue en el ejemplo, en este caso yo utilice el cargadór de imagenes bmp de Chris Backhouse, bajo la licencia GNU:
BMPLoad("texturas/LABS.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,
GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
3.- ¿Cuáles son los atributos/caracteristicas que se pueden declarar en Open/GLUT para manejo de:
-Luces
Las caracteristicas expresadas arriba, el tipo de luz ambiente, especular o difusa.
-Materiales
La manera en la que va a reflejar la luz recibida, de que manera debe de ser interpretada.
-Texturas
La forma de aplicar el material al poligono donde se encuentre pegado, puede ser modular, reemplazar, calcomania o fundido.
4.- Escriba un programa donde:
-Dibuje un cubo y asigne características de material que lo hagan verse como de madera
-Aplique una textura de madera al cubo (bitmap)
-Aplique como textura su fotografía
El cambio de modo se hará con un click del mouse
void CuboDePractica (void){
if (practica.cambiaCubo >= 3)
practica.cambiaCubo = 0;
printf("cambiacubo: %d\n",practica.cambiaCubo);
Material(0);
BMPClass bmp;
if (practica.cambiaCubo == 0){
Material (13);
glDisable(GL_TEXTURE_2D);
}
if (practica.cambiaCubo == 1){
BMPLoad("texturas/madera.bmp",bmp);
glEnable(GL_TEXTURE_2D);//se activa el mapeado de texturas
}
if (practica.cambiaCubo == 2){
glEnable(GL_TEXTURE_2D);//se activa el mapeado de texturas
}
glPushMatrix();//Despliegue del cubo con imagenes
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo1.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,1.0);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo2.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,-1.0);
glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f( 0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo3.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(-1.0,0.0,0.0);
glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo4.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(1.0,0.0,0.0);
glTexCoord2f(0.0,1.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f( 0.5,-0.5,-0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/yo5.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,0.5,0.5);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f( 0.5,0.5,-0.5);
glEnd();
if (practica.cambiaCubo == 2)
BMPLoad("texturas/LABS.bmp",bmp);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.bytes);
glBegin(GL_QUADS);
glNormal3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,-0.5);
glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);
glTexCoord2f(0.0,1.0); glVertex3f(-0.5,-0.5,0.5);
glTexCoord2f(1.0,1.0); glVertex3f(0.5,-0.5,0.5);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
}
Suscribirse a:
Comentarios (Atom)

