INFOG - Web de Javi Agenjo

INFOG

Última actualización: 7/04/2014

La asignatura trata sobre los algoritmos necesarios para pintar entornos 2D y 3D. Las prácticas se programan en C/C++ usando OpenGL como librería gráfica. Se tocan temas relacionados con algoritmos de pintado de lineas, clipping,transformaciones geometricas, camaras, curvas e iluminacion.

Para cualquier duda contactarme a mi mail de gmail o venid a mi despacho entre las 11:00 y las 20:00.

Material

Codigo: Framework de la asignatura C++ (funciona en Visual Studio aunque puede compilarse con GCC)
(COMO CORREGIR ERROR AULAS)

La asignatura requiere de conocimientos previos de C++, si no teneis mucha experiencia o hace mucho que no trabajais en C++ os recomiendo encarecidamente que visiteis mi sección sobre consejos para programar en C++, os ahorrará muchos problemas.

Práctica 1: Framebuffer

Teneis que rellenar la imagen que hay en la clase Applicaiton con algun tipo de forma interesante y mostrarla por pantalla. Para ello debeis implementar alguno de los algoritmos comentados en clase:

  • Formas geometricas simples a base de puntos (usando trigonometria)
  • Ecuacion por pixel (pinta alguna imagen procedural interesante) (inspiración)
  • Un programa que permita pintar con el mouse (idea)
  • Una pequeña animacion procedural (video)

Se valorará la interacción con el usuario (el uso del teclado y el raton), el uso de la variable time para animar, asi como la complejidad técnica de la escena que se pinte.
No se valorará la parte artistica, asi que no dediqueis demasiado tiempo a construir un paisaje pixel a pixel.

Teneis que tener soltura con el framework y con C++. Mirad las funciones que se os suministran y tratad de hacer algo interesante.

La fecha de entrega es al empezar la próxima clase, debeis entregarme un ZIP que contenga el codigo fuente, un README.txt con vuestros datos e información de lo que habeis hecho, cómo funciona, qué teclas usar, etc.

 

Práctica 2: Raster de primitivas

Pintado de primitivas simples como lineas, circulos y triangulos rellenos.
Slides sobre raster.
Teneis que implementar el algoritmo de pintado de lineas, circulos y rellenado de triangulos.

  • Podeis añadir métodos a la clase Image cómo drawLine, drawCircle, drawTriangle, (o drawFilledTriangle) o los que creais oportunos. Si podeis haced tambien versiones para lineas y triangulos donde le pasais el color en cada vertice e interpolan entre medio.
  • Tratad de que sea eficiente, recordad que en bresenham no podeis emplear floats en el calculo de los pixeles por los que pasa la linea.
  • Aseguraos de que las lineas de bresenham funcionan en todos los octantes.
  • Permitid al usuario poder clickar en la pantalla e ir añadiendo nuevos puntos (tanto para lineas, como para circulos y triangulos), no es valido que los valores de los vertices de las primitivas ya vengan definidos por codigo.
  • Las primitivas tienen que poderse pintar sobre la imagen que ya hay pintada, de manera que el usuario pueda pintar un circulo, luego una linea, luego un triangulo, luego otro circulo, y se vea el resultado con todas ellas pintadas, como en cualquier aplicacion de dibujo (no vale ir borrando el framebuffer cada vez, intentad crear un framebuffer global donde vayais acumulando las primitivas).
  • Permitir al usuario elegir qué figura pintar usando el teclado (p.e: 1. DDA, 2. Bresenham, 3. Circulos, 4. Triangulos) y tratad que no haya que hacer combinaciones raras de teclado para completar las figuras, que baste con hacer dos clicks en la pantalla para definir una linea, dos para definir un circulo (primero centro, segundo borde del circulo) o tres para un triangulo.

La fecha de entrega es al comienzo de la próxima clase.

Práctica 3: Proyección 3D -> 2D y meshes

Como convertir de un espacio 3D a uno 2D
Slides sobre camara y proyección.

Teneis que implementar la proyección de 3D a 2D usando matrices y proyectar los vertices 3D a 2D para poder pintarlos usando vuestro algoritmo de bresenham.

Material

Requisitos

  • Implementar los metodos de la clase Camera siguiendo los slides:
    class Camera
    {
            //...
    	void updateViewMatrix( void );
    	void updateProjectionMatrix( void );
    };
  • Proyectar varios puntos usando la viewprojection_matrix usando la function projectVector de la clase Camera.
  • Convertir los puntos proyectados de espacio normalizado (-1…+1) al rango del framebuffer (0…window_width)
  • Pintad lineas en 3D proyectando el start y el end de cada linea y aplicando bresenham o DDA. Para ello teneis que unir los vertices de 3 en 3 (el 1 con el
    2 y el 3, el 4 con el 5 y el 6, el 7 con el 8 y el 9, …)
  • La posición de la camara (eye) se tiene que poder controlar con el teclado (sin afectar al center).
  • La posicion donde apunta la camara (center) se tiene que poder controlar con el teclado (sin afectar al eye).
  • Teclas para poder controlar el FOV de la camara.
  • Probad de pintar un grid en el suelo para testear.
  • Opcional: Rellenar los triangulos de colores diferentes y probad de implementar un Z-Buffer (un framebuffer que contenga la profundidad de cada pixel normalizado entre near y far).

Practica 4:  Usando la GPU

Teneis que implementar iluminación por Phong usando OpenGL y shaders.

Material

Requisitos

  • Implementar iluminación por vertice (Gouraud).
  • Implementar iluminación por pixel (Phong).
  • Crear instancias de Light y Material.
  • Las propiedades de la luz y del material deben poder controlarse con el teclado, no es necesario controlar cada aspecto por separado, bastas con tener algunas configuraciones ya hechas tanto de luz como de material y poder elegir con el teclado (luz roja, luz verde, objeto rojo, objeto verde).
  • Para los settings iniciales usad ambiente del material (1,1,1) y ambiente de la luz (0.1,0.1,0.1) y al material ponerle de glosiness (alpha) un valor de 50. Los demas valores elegidlos a vuestra discrecion pero tratad de que tengan sentido.
  • Permitir controlar la posicion de la luz (con los cursores) y el eye de la camara (con WSAD).
  • Opcional: permitir más de una luz (mirad el tema de blending)

La entrega será al comienzo de la siguiente clase.

Practica 5: Usando texturas

Teneis que usar texturas para mejorar el resultado de la practica 4. Solo teneis que implementar un shader Phong pero usando las texturas para modular el diffuse, el specular y la normal.

Material

Requisitos

  • Hacer uso de las texturas para mejorar el resultado del render de la P4.
  • Se os dan dos texturas, la color_spec y el normalmap.
  • La textura de color_spec contiene en RGB informacion sobre la componente difusa del material, y el canal A contiene informacion sobre cuanta luz especular tiene ese punto.
  • La textura de normalmap te da una normal precisa para cada pixel, mucho mejor que la normal que teniamos por vertice, pero recordad que esta normal viene codificada en colores (que van del rango 0..1) mientras que las normales tienen que ir del rango -1..1, asi que aseguraos de convertir el valor que leeis del normalmap al rango de una normal.
  • Intentar que funcione con mas de una luz usando blending (pintando la mesh varias veces con diferentes luces)

La entrega será una semana despues de la introduccion de la practica.