Diferencia entre revisiones de «UNITY Texturas»
| Línea 414: | Línea 414: | ||
<br /> | <br /> | ||
| + | ===Ejemplo de uso=== | ||
| + | |||
| + | * Descargar la textura y el normal map [https://3dtextures.me/2018/03/19/stone-wall-008/ de este sitio web]. | ||
| + | : Modelo realizado por [https://ko-fi.com/N4N259VG João Paulo]. | ||
| + | |||
| + | |||
| + | <gallery caption="Aplicando un Normal Map" widths="350" heights="300px" perrow="2"> | ||
| + | Image:Unity3d_normalmap_11A.JPG| Arrastramos los archivos descargados a una carpeta creada previamente de nombre 'Muro'. | ||
| + | Image:Unity3d_normalmap_11.JPG | Ahora arrastramos la textura a un objecto 3D creado previamente y modificada su apariencia para que parezca un muro. Fijarse que al hacerlo se crea un directorio de nombre 'Materials' que es donde está creado el material que se está aplicando al objecto 3D. En su propiedad 'albedo' está la textura. | ||
| + | Image:Unity3d_normalmap_12.JPG| Ahora creamos un punto de luz y lo situamos delante del muro. | ||
| + | Image:Unity3d_normalmap_13.JPG| Podemos comprobar como la piedra no da la sensación de tridimensionalidad. | ||
| + | Image:Unity3d_normalmap_14.JPG| Seleccionando el material podemos comprobar como no tiene 'Normal Map' asociado. Podemos arrastrarlo a dicha propiedad o seleccionarlo. | ||
| + | Image:Unity3d_normalmap_15.JPG| Para seleccionar el Normal Map, debemos pulsar el círculo que aparece al lado de la propiedad y aparecerá una lista con todas las texturas del proyecto. Seleccionaremos la que se corresponde al Normal Map descargado. Podemos ver como queda el muro. | ||
| + | </gallery> | ||
| + | |||
| + | |||
| + | <br /> | ||
===Creando un Normal Map=== | ===Creando un Normal Map=== | ||
Revisión del 11:58 28 oct 2018
Sumario
Introducción
- Una textura representa una imagen que se 'pega' a la superficie de un objeto 3D o 2D.
- Un objeto dentro del juego en un mundo 2D se representará como un cuadrado/rectángulo.
- Sobre ese cuadrado se dibujará una imagen (textura) que será lo que represente a nuestro personaje dentro del juego.
- En el caso de las figuras 3D, estas están formadas por muchos triángulos unidos formando una figura en el espacio 3D, como ya comentamos anteriormente en esta WIKI.
- Las texturas van a ser las imágenes que se van a poner 'encima' de la malla tridimensional que representa a la figura para darle un aspecto realista.
- La pregunta aquí sería, ¿ cómo podemos acoplar una imagen bidimensional (la textura) a una figura tridimensional ? Lo veremos a continuación.
- Para trabajar con texturas podemos hacer uso de varios programas como:
Los colores
- Cuando dibujamos un gráfico, la textura tiene información de qué color tiene que tener en cada pixel (punto) que se va a dibujar.
- Esta información sigue un modelo de colores. En este punto se va a explicar el modelo RGB (Red-Green-Blue)
- Existen otros modelos como YUV o CMYK.
- Con estos tres colores básicos (rojo-verde-azul) podemos obtener cualquier color mezclándolos en la proporción correcta.
- Por ejemplo:
- Todos los colores anteriores se obtienen como combinación de los tres básicos: RED – GREEN – BLUE.
- Cada color básico se puede expresar con un número en coma flotante entre los valores 0.0f - 1.0f (siendo 1 la intensidad más alta y 0 la más baja)
- También se puede codificar cada color con un byte con valores entre 0 y 255.
- Dependiendo de las diferentes opciones podemos tener diferentes formatos RGB:
- Codificación RGB de 32 bits: tiene 12 bytes por cada pixel (32 bits por color (al ser flotante) = 4 bytes x 3 colores=12 bytes). Las intensidades pueden varias entre 0.0f y 1.0f.
- Codificación RGB de 24 bits: tiene 3 o 4 bytes (si tiene alfa, visto después) por cada pixel (8 bits por color = 1 bytes x 3 colores=3 bytes). Las intensidades pueden varias entre 0 e 255. La orden de los componentes puede ser RGB o BGR. Se conoce como RGB888 o BGR888.
- Codificación RGB de 16 bits: tiene 2 bytes por cada pixel. Red y blue tienen una intensidad que varía entre 0 y 31 (5 bits x 2 = 10 bits) y el verde una intensidad entre 0 y 63 (6 bits). El orden puede ser RGB o BGR y se conoce como RGB565 o BGR565.
- Lo normal es trabajar con el formato RGB888.
Formato de imágenes
- A la hora de guardar imágenes disponemos de multitud de formatos diferentes.
- JPEG es un formato que pierde calidad con respecto a la imagen original pero tiene una nivel de compresión alto (ocupa menos en disco).
- PNG no pierde calidad y es idéntica a la imagen original.
- Nota: Siempre que utilicemos una imagen que no necesite transparencia (explicado a continuación) ni una calidad excesiva debemos eligir el formato jpg ya que tiene un gran nivel de compresión.
El componente Alfa: Nivel de transparencia.
- El componente alfa es un número que indica el nivel de transparencia de una imagen.
- Normalmente al superponer una imagen sobre otra, la imagen superior 'tapa' a la inferior.
- Cuando creamos una imagen esta tiene una forma cuadrada/rectangular ya que al guardar le tenemos que dar un tamaño en pixeles (puntos) en su ancho y alto.
- Sin embargo, los personajes que conforman un juego no tienen esa forma, puede ser redonda, con bordes redondeados,...
- Si disponemos de un fondo y queremos que el personaje pase por dicho fondo, tendríamos este efecto:
- Gracias al componente alfa podemos establecer que un determinado color sea transparente (lo que se conoce como alfa).
- Así, aplicado a los formatos gráficos vistos anteriormente, podemos aplicar el formato RGBA8888 (y sus variantes). Con esto indicamos que el componente alfa está compuesto por un valor que va desde 0 (totalmente transparente) a 255 (totalmente opaco).
- Si hacemos que en el ejemplo el color blanco sea totalmente transparente, conseguiremos este efecto:
- IMPORTANTE: Si la imagen necesita transparencias no podemos guardarla en el formato JPG. Obligatoriamente tendría que ser PNG.
- Para hacer un color transparente en GIMP:
- Vídeo de como facer un fondo transparente en GIMP: https://www.youtube.com/watch?v=m-7j6bP94fg
- También podemos asignar a un color un nivel de transparencia como se indica en la siguiente imagen:
Texturas en objetos 3D
- Como comentamos anteriormente, la forma en como asociamos una textura (imagen bidimensional, con un ancho-alto) a una figura tridimensional (denominada Mesh) es la de 'pegar' la imagen sobre las caras que conforman la figura.
- Por lo tanto, primero debemos de recortar la figura 3D en sus caras, para que estas queden dibujadas de una forma bidimensional.
- Veamos un ejemplo con un cubo (algo supongo que todos hemos hecho alguna vez :) )
- Como vemos tenemos un objeto 3D (el cubo) el cual lo hemos 'recortado' para que sus caras se dibujen sobre una superficie 2D.
- Ahora solo tenemos que pasar cada textura (tenemos 6, aunque podemos utilizar la misma textura en cada cara) a cada una de las caras del cubo.
- El programa 3D ya se encargará de 'colocar' cada textura en cada una de las caras.
- Este concepto lo podemos aplicar a cualquier figura 3D.
- Lo normal es que una figura 'compleja' la tengamos dividida en 'trozos' para que cada uno de ellos tenga texturas diferentes.
- Otro ejemplo lo encontramos cuando queremos representar un planeta.
- La figura 3D que representa un planeta es una esfera (no exactamente, ya que los planetas están achatados pero simplificamos).
- Para 'pegar' la textura, una de las formas de hacerlo, es cortar la esfera por la mitad (como si fuera una naranja para hacer zumo) y 'aplastar' las dos mitades sobre el plano. Una vez hecho esto, podemos poner encima una textura como la siguiente:
- La podemos poner sobre la esfera de esta forma:
- Veamos otro con una nave espacial:
- Texturas aplicacas a nave espacial
- Gráficos obtenidos del Blog de Xoppa-LIBDX
- En Unity disponemos de multitud de recursos gráficos que ya vienen con sus propias texturas, pero que una vez tenemos los conceptos anteriores claros, siempre podremos modificar o añadir nuevas texturas creadas por nosotros.
- Notas Importantes:
- Cuando creemos nuestras texturas, estas siempre deben de tener un tamaño potencia de 2, es decir, 256,512,1024,2048.
- Si se realizan con un programa 3D, seguramente, este ya os dará como opción un tamaño de los indicados anteriormente.
- Siempre es mejor trabajar con las resoluciones más grandes que vamos a necesitar. Reducir dicha resolución a un tamaño menor se realiza fácilmente.
- Unity permite realizar una compresión de la textura sin casi pérdida de calidad.
- Unity recomienda utilizar el formato de fichero .tga para guardar texturas con información de transparencia (canal alfa). En caso de no necesitar tener transparencias, hacer uso de los formatos .jpg y .png.
Ejemplo de aplicación de textura en Unity
- Si no lo habéis hecho ya al llegar a este punto, es hora de que aprendamos como agregar nuevos recursos a nuestro proyecto.
- Pasar a leer el punto Recursos: Asset Store.
- Una vez hecho, vamos a incorporar a nuestro proyecto texturas para el planeta Tierra (vienen otras texturas a mayores para crear planetas 'alienígenas').
- Buscar en el asset store recursos para texturas de planetas (buscar por 'Planet Textures' y filtrar solo los recursos gratuitos).
- Aparecerá el siguiente recurso:
- Instalar e importar el recurso anterior.
- Una vez hecho dispondréis en al ventana de 'Proyect' de una nueva sección y dentro de ella, la sección 'Texturas'.
- Vamos a crear una esfera y a añadir la textura indicada:
- Asociando una textura a una esfera
Para 'asociar' la textura al objeto 3D, debéis de pulsar con el botón izquierdo del ratón sobre la textura y arrastrarla. Podéis arrastrarla a la esfera en la vista de escena o a la ventana inspector de la esfera (previamente seleccionada). Al hacerlo, en las propiedades de la esfera aparecerá en la sección Shader el nombre de la imagen que hemos 'arrastrado'.
- Para hacerlo un poco más divertido vamos a hacer que el planeta 'rote'.
- Primero descargar este archivo a vuestro ordenador: Archivo:Unity Curso Rotar.zip. Debéis de descomprimirlo. Aparecerá un archivo con extensión .cs
- Rotando el planeta
Ahora dentro del Unity arrastramos como hicimos antes con la imagen, pero esta vez con el script, hasta la esfera o si está seleccionada podemos arrastrar el script a la ventana inspector. Al hacerlo aparecerá un nuevo elemento de tipo 'script' con el nombre del mismo.
Asociando nuevas texturas a objetos 3D
- Disponéis en la página principal del curso de varios programas para el diseño de figuras 3D y animaciones.
- Podéis escoger el que queráis, ya que en todos ellos vais a encontrar la forma de realizar lo que voy a explicar a continuación.
- Yo os recomiendo el Wings3D por su sencillez, ya que lo que vamos a hacer no requiere de grandes funciones y el manejo es relativamente sencillo.
- Lo que voy a exponer en este punto es la forma de poder crear figuras sencillas (un cubo en el videotutorial) y asociarles una textura.
- La ventaja que tiene Unity es que disponemos de muchos recursos gráficos para incorporar a nuestro juego, pero creo que a nivel de hacer aplicaciones/juegos para los alumnos de secundaria, puede ser interesante para el profesor poder crear figuras 3D con sus propios gráficos, como representar átomos, bacterias,....
- Las texturas las podéis obtener de internet o escanear un dibujo y guardar el gráfico que después podríais asociar a una figura 3D.
- Los pasos a seguir son:
- Descargar e instalar el programa Wings3D, versión 2.1.7.
- Descargar unos patch´s del programa de la misma versión (2.1.7).
- Mover los archivos descargados al directorio: C:\Program Files\wings3d_2.1.7\lib\wx-1.8.3\ebin (o al directorio donde instalasteis el Wings3D, carpeta lib\wx-1.8.3
- Disponéis en este enlace de tres vídeos en los que os explico como crear figuras sencillas 3D y cómo asociarles las texturas.
Importando los modelos creados a Unity
- Tenéis más información sobre los formatos soportados por Unity en este enlace.
- En esta wiki también explico otras operaciones interesantes que se pueden hacer.
- Una vez creado el modelo en Wings realizamos el siguiente proceso:
- Importando modelo 3D con texturas al Unity
Ahora en el programa Unity, en la pestaña de 'Assets' podemos organizarlo como queramos (en forma de carpetas). En este caso creé una carpeta de nombre 'Propios' y dentro de esta, una nueva carpeta de nombre 'Cubo' (para crear una subcarpeta debéis presionar el botón derecho sobre la carpeta y escoger la opción 'Create' => 'Folder'.
Ahora es necesario asociar la textura al nuevo asset. Para ello es necesario crear un 'material'. Un material va a determinar como se refleja la luz sobre el objeto y otra seria de características. Esta parte será abordada en la sección avanzada. Para hacerlo más simple, vamos a crear el material de una forma 'indirecta'. Vamos a arrastrar el nuevo objeto a la vista de escena.
Ahora arrastramos la imagen de la textura al GameObject creado que se encuentra en la vista de escena. Fijarse como se crea una nueva carpeta de nombre Materials. Si arrastramos un nuevo Asset del cubo a la vista veremos que este no lleva la textura asociado. Esto es así ya que el Asset del cubo no tiene asignado el material que se creó. Vamos a asignárselo.
Asociando texturas a modelos complejos
- En los ejemplos anteriores estamos asociando texturas a objetos simples, como cubos o esferas.
- Pero el mismo principio podéis aplicarlo a figuras más complejas.
- La forma de abordarlo puede ser:
- Crear una única figura compleja y 'recortarla' en trozos diferentes. Esto sería lo mismo que hemos hecho con las figuras simples.
- Crear una figura compuesta por múltiples figuras simples, recortar cada figura simple y asociar a cada una de ellas una textura. Veamos un ejemplo.
- Importando modelo 3D complejo
Avanzado: Conceptos para programadores
- Lo que viene a continuación son unas explicaciones teóricas para los alumnos que realizan el ciclo de Programación de aplicaciones multiplataforma.
- Como comentamos anteriormente, las figuras 3D están formadas por múltiples triángulos.
Shaders
- Resulta que a partir de la versión OPEN GL 2.0 los gráficos se renderizan utilizando Shader´s. Los Shader son programas escritos en un lenguaje parecido a C que se denomina GLSL y que permite modificar las propiedades de los puntos que se van a renderizar pudiendo hacer efectos muy complejos.
- En Unity, se pueden escribir 'shader program' en el lenguaje anterior, pero el que utiliza es una modificación del HLSL denominado Cg.
- El proceso de aplicar un 'Shader Program' a una figura se divide en dos etapas:
- Vertex Shader: se aplican operaciones a cada uno de los vértices de la figura. Por ejemplo, podríamos modificar la posición y tamaño de un objecto 3D.
- Fragment Shader: es la segunda etapa. A diferencia de la anterior se va a aplicar a cada fragmento de la figura. Por simplificar vamos a identificar fragmento como pixel. Como podéis suponer el coste de GPU será mayor que en el caso anterior, por lo que no se debe abusar de estos mecanismos. Por ejemplo, podríamos cambiar el color de cada pixel de la figura y realizar efectos de brillo, oscuridad,...
- Ejemplos que se pueden realizar con Shaders:
- Más información en:
- A partir del Unity 2018, existe una herramienta que viene integrada con Unity y que nos permite desarrollar Shaders sin necesidad de tener unos conocimientos de programación avanzados.
- Esta herramienta es el Shader Graph Editor.
- Tenéis en este enlace información y ejemplos sobre dicha herramienta.
- Vídeos:
- En este enlace tenéis un vídeo explicativo de su funcionamiento.
- Otro ejemplo de desarrollo.
Colores
- En OPENGL se puede establecer el color en cada uno de los vértices del triángulo. Si los tres vértices tienen el mismo color, la superficie del triángulo entera se dibuja del color indicado.
- Si cada vértice tiene un color diferente, se produce un degradado de un color al otro.
Texturas
Materiales
=Introducción
- Máis información en este enlace.
- Los materiales van a estar asociados a figuras 3D.
- Los materiales van a:
- Guardar la textura asociada a el material creado, que después será aplicado a un Mesh (objecto 3D). Esta sería la textura sin ningún tipo de fuente de luz aplicada al material.
- Guardar la información necesaria para determinar como una fuente de luz va a reflejarse sobre el Mesh (son los Normal Vector, lo veremos después).
- Características del material que hacen que la luz se refleje de forma diferente (haciendo que el material adapte características como transparencia, metálico,...)
- Pensemos en el mundo real.
- Un objeto metálico refleja la luz de forma diferentes a un trozo de madera.
- Un cristal permite ver lo que está a través de él...
- Todas estas características físicas son modelizadas haciendo uso de materiales.
Creando un material
Normal Map
- Alguna de las imágenes de esta sección han sido obtenidas del manual de Unity.
- Este mapa representa la forma en como los rayos de luz se reflejan sobre la superficie de un objeto.
- Si no disponemos de él, Unity hará uso del Mesh empleado para el diseño del objeto3D y hará que la luz se refleje siguiendo dicho modelo:
- Normal Map aplicado a un cilindro
- Estaréis pensando: Vale, ¿ pero en qué me influye a mi el reflejo de la luz sobre una figura 3D ? ¿ Cual puede ser la aplicación práctica ?
- Imagináis que tenéis un muro hecho con piedras.
- La figura 3D que representa el muro es plana, como un cubo alargado o cualquier otra combinación de figuras 3D que podemos tener en un programa de diseño 3D.
- Si aplicamos sobre dicha figura una textura de piedras, tendremos algo parecido a esto:
- Como podemos apreciar, las piedras aparecen 'planas' sobre la superficie.
- Esto es así ya que el modelo 3D no 'incorpora' este tipo de detalle. Hacerlo supondría tener que dibujar muchos más triángulos con el consiguiente coste de CPU-Memoria.
- Gracias a los 'Normal Map' podemos 'simular' que las piedras realmente tienen un volumen 3D, como en la siguiente imagen:
- Otro efecto que podemos conseguir haciendo uso de los Normal Map es el de incluir formas sobre una superficie, sin necesidad de modelizarlas en el modelo 3D.
- Veamos un ejemplo:
- Normal Map con formas aplicado a un cilindro
- Debemos de tener claro que esas formas no existen realmente no existen en el modelo. Lo que hace Unity es aplicar una fuente de luz sobre el objeto 3D y los rayos reflejados sobre la superficie del Normal Map hacen que parezca que esas formas existen. Si nos acercáramos mucho al modelo veríamos que realmente no existen en el 3D.
- Nota:Lo que se hace normalmente es tener un modelo 3D con un nivel de detalle altísimo sobre el que se extrae el 'Normal Map'.
- Después se realiza otro modelo más sencillo (sin tanto nivel de detalle) y sobre dicho modelo se aplica el 'Normal Map' extraído del paso anterior.
- Podéis descargar ejemplos de texturas junto con su 'normal map' desde https://3dtextures.me/
Ejemplo de uso
- Descargar la textura y el normal map de este sitio web.
- Modelo realizado por João Paulo.
- Aplicando un Normal Map
Creando un Normal Map
- Vamos a ver un ejemplo haciendo uso del programa GIMP.
- Para poder crear un Normal Map debemos descargarnos un 'plugin' para Gimp deste este enlace.
- Instalando el plugin NormalMap para Gimp
-- Ángel D. Fernández González -- (2018).



