{"id":184,"date":"2010-05-25T10:41:31","date_gmt":"2010-05-25T10:41:31","guid":{"rendered":"http:\/\/www.tecn.upf.edu\/~jagenjo\/?p=184"},"modified":"2010-05-25T10:41:31","modified_gmt":"2010-05-25T10:41:31","slug":"infografia-i-practica-9-iluminacion","status":"publish","type":"post","link":"https:\/\/tamats.com\/upf\/?p=184","title":{"rendered":"Infografia I: Pr\u00e1ctica 9: Iluminaci\u00f3n"},"content":{"rendered":"<p>En esta pr\u00e1ctica aprenderemos a sombrear objetos para dar m\u00e1s realismo y profundidad a la escena usando los algoritmos de Goureud y Phong. Adem\u00e1s servir\u00e1 para aprender c\u00f3mo sacar toda la potencia de las nuevas tarjetas gr\u00e1ficas mediante el uso de Shaders.<\/p>\n<p><!--more--><\/p>\n<h3>Material<\/h3>\n<ul>\n<li><a href=\"http:\/\/docs.google.com\/present\/edit?hl=en&amp;id=dg932qn8_100pk8zcmhc\" target=\"_blank\">Slides sobre Shaders<\/a><\/li>\n<li><a href=\"http:\/\/docs.google.com\/present\/edit?id=dg932qn8_102fsbs98c8\" target=\"_blank\">Slides sobre Iluminaci\u00f3n con Shaders<\/a><\/li>\n<li><a href=\"uploads\/practicas\/framework_prac9.zip\">C\u00f3digo  Framework<\/a><\/li>\n<\/ul>\n<h3>Enlaces \u00fatiles<\/h3>\n<ul>\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Gouraud_shading\" target=\"_blank\">Wikipedia: Goureud Shading<\/a><\/li>\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Phong_shading\" target=\"_blank\">Wikipedia: Phong Shading<\/a><\/li>\n<li><a href=\"http:\/\/www.opengl.org\/sdk\/libs\/OpenSceneGraph\/glsl_quickref.pdf\" target=\"_blank\">PDF con la referencia de uso de GLSL<\/a><\/li>\n<\/ul>\n<h3>Requisitos<\/h3>\n<ul class=\"good\">\n<li><strong>Codigo en C\/C++ y GLSL<\/strong> de una aplicaci\u00f3n que pinte una mesh con el modelo de iluminaci\u00f3n Gouraud y Phong.<\/li>\n<li>Se os da un shader con <strong>una versi\u00f3n simplificada de Goureud sin especular<\/strong> (light.ps + light.vs), que tiene lo justo para hacer el c\u00e1lculo del \u00e1ngulo que forma la luz con la normal (y ademas el color del foco).<\/li>\n<li>Teneis que modificar el c\u00f3digo del shader y de la pr\u00e1ctica para que soporte un modelo de iluminaci\u00f3n realista, es decir, que el objeto tenga propiedades y los focos de luz tambien, y despues usar estas propiedades en la ecuaci\u00f3n de la luz que pinta el objeto.<\/li>\n<li>Para ello teneis que programar <strong>dos shaders diferentes, uno para Gouraud y otro para Phong<\/strong>. Recordad que cada shader se compone de un <strong>Vertex Shader<\/strong> y un <strong>Pixel Shader<\/strong>.<\/li>\n<li>No teneis que programar ningun tipo de interpolaci\u00f3n, la tarjeta ya se encarga de interpolar los valores que llegan al pixel shader enviados desde el vertex shader en funcion de la distancia a cada vertice (usando las variables varying).<\/li>\n<li>En vuestros shaders es necesario que tengais en cuenta las siguientes variables que afectan a la ecuaci\u00f3n de la luz, estas variables definen las propiedades del material y de la luz y deben ser enviadas desde la aplicaci\u00f3n al shader:\n<ul>\n<li><strong>Color Ambiente del objeto<\/strong> (si es un objeto muy afectado por la luz ambiente, por lo general usad (1,1,1)<\/li>\n<li><strong>Color Difuso del objeto<\/strong> (color del material del objeto)<\/li>\n<li><strong>Factor de Specular del objeto<\/strong> (si programais la luz especular)<\/li>\n<li><strong>Glossiness del objeto<\/strong> (Shininess), define si un objeto es metalico o mate usad un factor entre 1.0 (plastico) y 20.0 (metalico) solo si programais la luz especular.<\/li>\n<li><strong>Color ambiente de la escena<\/strong> (luz que viene del cielo en general, ponedla baja o quemar\u00e1 la escena) (0.1,0.1,0.1)<\/li>\n<li><strong>Color de la luz (difuso)<\/strong> normalmente se trabaja con luz blanca (1,1,1)<\/li>\n<li><strong>Posicion de la luz<\/strong> (vector que define donde est\u00e1 el foco de luz en espacio de mundo)<\/li>\n<\/ul>\n<\/li>\n<li>Recordad, teneis que implementar los siguientes modelos de iluminacion (shaders) que utilicen las propiedades anteriores:\n<ul>\n<li><strong>Modelo Gouraud<\/strong> todo el calculo se hace desde el Vertex Shader y solo se le pasa al Pixel Shader el color final.<\/li>\n<li><strong>Modelo Phong<\/strong> desde el vertex shader computamos los vectores importantes, y los pasamos al pixel shader, all\u00ed se normalizan los que deban estar normalziados (ya que al haber sido interpolados se pierde la normalizacion) y se usan para calcular el color final.<\/li>\n<\/ul>\n<\/li>\n<li>Para la ecuaci\u00f3n de la luz os recomiendo usar la de <a href=\"http:\/\/docs.google.com\/Presentation?id=dg932qn8_102fsbs98c8\">estos slides<\/a><\/li>\n<li>Sugerencias opcionales:\n<ul>\n<li>Ampliar el modelo de iluminaci\u00f3n para que soporte <strong>reflexion especular<\/strong>. Necesitareis el vector Eye que es el que va desde el centro de la c\u00e1mara al punto en cuesti\u00f3n.<\/li>\n<li><strong>Soportar m\u00e1s de una luz<\/strong>. Basta subir los parametros de la luz dos veces y sumar los resultados del calculo de iluminacion para cada foco.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Fallos comunes<\/h3>\n<ul class=\"bad\">\n<li>No configurar correctamente el visual para que sepa cual es la carpeta de donde tiene que cargar coger los archivos con el codigo de los shaders. Cuando cargas un archivo desde codigo usando una ruta relativa (p.e.: &#8220;shaders\/light.ps&#8221; en lugar de &#8220;c:\/my_folder\/shaders\/light.ps&#8221;) el sistema lo busca desde la carpeta donde se ejecuta la aplicaci\u00f3n, en el visual es la carpeta donde se encuentra el proyecto. Si quereis cambiarla vais a propiedades del proyecto y en Depuraci\u00f3n, donde sale Directorio de trabajo, puedes poner la carpeta que querais usar como raiz (por ejemplo la carpeta donde descomprimisteis el codigo).<\/li>\n<li>No instalar glew. Necesitais instalar glew para que funcione en OSX o Linux (en windows viene con las librerias que hay colgadas en la web).<\/li>\n<li>User un ordenador con una tarjeta que no soporte shaders (cualquier tarjeta Nvidia o ATI soportar\u00e1 shaders), incluso algunas tarjetas integradas los soportan. Si no lo soporta saldr\u00e1 un error en consola indicando que tu tarjeta no soporta shaders.<\/li>\n<li>Utilizar vectores que estan en diferentes sistemas de coordenadas. Recordar, un punto en espacio local se convierte a espacio de mundo cuando se multiplica por la model, y se convierte a espacio de pantalla si se multiplica por la MVP. Suele ser c\u00f3modo trabajar en espacio de mundo todo el tiempo (aunque el Vertex Shader tiene que retornar siempre el vertice en espacio de pantalla).<\/li>\n<li>No normalizar los vectores que lo requieran o normalizar los que no lo necesitan. Teneis que entender la ecuaci\u00f3n.<\/li>\n<li>Asumir que las intensidades de la ecuaci\u00f3n son un solo valor. Las intensidades nos dicen c\u00f3mo se comporta en diferentes colores, por lo tanto son colores, un objeto puede tener una componente de intensidad muy roja o muy azul o muy verde, con lo cual no es un unico float, son vectores de tres componentes, es decir, colores.<\/li>\n<li>Hacer producto vectorial o escalar entre vectores que contienen colores. No tiene ninguna logica multiplicar vectorialmente colores, lo que s\u00ed que tiene logica es multiplicar cada componente de un color por la de otro, a ese proceso se le llama modular, y sirve para por ejemplo saber cual ser\u00eda el color resultante si un objeto de un color fuese iluminado por una luz de cierto color.<\/li>\n<li>Multiplicar vectores geom\u00e9tricos por vectores con colores o sumarlos. No tiene sentido, la componente X de un vector que hace referencia a una posici\u00f3n no tiene nada que ver con el color rojo, etc. Los vectores geom\u00e9tricos (normales, front, etc) se usan para calcular un escalar (cuanta luz afecta) y ese escalar es el que multiplica luego a las componentes de color para definir su intensidad (si le afecta mucho ser\u00e1 1.0, si no le afecta nada ser\u00e1 0.0).<\/li>\n<li>Pasar variables uniform desde el Vertex Shader al Pixel Shader usando Varying. No hace falta, esas variables no necesitan interpolarse, ya que desde el Pixel Shader podemos acceder igualmente a las variables uniform, estas no son exclusivas del vertice, son genericas de la mesh por lo tanto es indiferente desde donde las leamos.<\/li>\n<\/ul>\n<div class=\"legend\">Valor: <strong>16 puntos<\/strong> <\/div>\n","protected":false},"excerpt":{"rendered":"<p>En esta pr\u00e1ctica aprenderemos a sombrear objetos para dar m\u00e1s realismo y profundidad a la escena usando los algoritmos de Goureud y Phong. Adem\u00e1s servir\u00e1 para aprender c\u00f3mo sacar toda la potencia de las nuevas tarjetas gr\u00e1ficas mediante el uso de Shaders.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=\/wp\/v2\/posts\/184"}],"collection":[{"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=184"}],"version-history":[{"count":0,"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=\/wp\/v2\/posts\/184\/revisions"}],"wp:attachment":[{"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tamats.com\/upf\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}