Diferencia entre revisiones de «UNITY Texturas»

De MediaWiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 27 ediciones intermedias de 2 usuarios)
Línea 3: Línea 3:
 
* Una [http://es.wikipedia.org/wiki/Textura_%28gr%C3%A1ficos_por_computadora%29 textura] representa una imagen que se 'pega' a la superficie de un objeto 3D o 2D.
 
* Una [http://es.wikipedia.org/wiki/Textura_%28gr%C3%A1ficos_por_computadora%29 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.
+
* Un objeto dentro del juego en un mundo 2D se representará como un cuadrado/rectángulo (Unity permite emplear sprites con otras formas, como círculos,...).
 
: Sobre ese cuadrado se dibujará una imagen (textura) que será lo que represente a nuestro personaje dentro del juego.
 
: Sobre ese cuadrado se dibujará una imagen (textura) que será lo que represente a nuestro personaje dentro del juego.
  
Línea 11: Línea 11:
 
: La pregunta aquí sería, ¿ cómo podemos acoplar una imagen bidimensional (la textura) a una figura tridimensional ? Lo veremos a continuación.
 
: La pregunta aquí sería, ¿ cómo podemos acoplar una imagen bidimensional (la textura) a una figura tridimensional ? Lo veremos a continuación.
  
 +
 +
* Relacionado con el concepto de Textura, Unity emplea '''Materiales''' que son los que van a llevar asociada la textura. Posteriormente Unity 'asocia' el material a la figura. Lo veremos [https://wiki.cifprodolfoucha.es/index.php?title=UNITY_Materiales en la sección de Materiales] de esta misma Wiki.
  
  
Línea 18: Línea 20:
  
 
<br />
 
<br />
 +
 +
* A partir de la versión 2018.1, Unity incorpora una nueva forma de renderizar las texturas denominada '''URP (Universal Render Pipeline)'''.
 +
: Entre las ventajas de usar este tipo de renderizado tenemos:
 +
:* Soporta técnicas avanzadas de sombreado
 +
:* Puede manejar texturas de mayor resolución más eficientemente que los pipelines más antiguos como el Built-In Render Pipeline de Unity.
 +
:* Permite una gestión más eficiente de los recursos gráficos, lo que es crucial para el rendimiento en dispositivos con recursos limitados.
 +
:* Puedes utilizar diferentes configuraciones y herramientas que te permiten controlar cómo se renderizan las texturas en diferentes dispositivos, adaptándose así a las necesidades específicas de cada plataforma.
 +
 +
 +
: Cuando creamos un proyecto nuevo, podemos escoger si vamos a hacer uso del nuevo sistema de renderizado o si seguimos con el antiguo.
 +
: En función de esta elección tendremos que tener en cuenta que a la hora de importar los paquetes de Unity o crear/usar materiales debemos de realizar unos ajustes para que se visualicen correctamente.
 +
: Lo indicaré cuando veamos los materiales.
  
 
=Los colores=
 
=Los colores=
Línea 92: Línea 106:
  
  
−
* <u><b>IMPORTANTE:</b></u> Si la imagen necesita transparencias no podemos guardarla en el formato JPG. Obligatoriamente tendría que ser PNG.
+
* <u><b>IMPORTANTE:</b></u> Si la imagen necesita transparencias no podemos guardarla en el formato JPG.
 +
: Obligatoriamente tendría que ser
 +
:* Formato PNG: Imagen comprimida sin pérdida de calidad. Algunas imágenes con transparencias no son importadas correctamente.
 +
:* Formato TGA ('''es el que recomienda UNITY'''): No comprime la imagen. Las transparencias siempre son importadas correctamente.
  
  
Línea 104: Línea 121:
  
  
 +
 +
* Desde GIMP podemos ver los diferentes canales y visualizarlos de forma independiente:
 +
[[Imagen:Unity3d_texturas_gimp_1.jpg|400px|center]]
  
 
<br />
 
<br />
 +
 
=Texturas en objetos 3D=
 
=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.
 
* 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.
+
<gallery caption="Texturas aplicadas a un modelo 3D" widths="450" heights="400px" perrow="2">
 +
Image:Unity3d_textura_1A.JPG| Las texturas se generan en un único archivo intentando aprovechar el mayor espacio posible. Forman lo que se denomina un '''MAPA UV'''. Siendo U la coordenada que representa el eje horizontal y V la coordenada que representa el eje vertical. Los valores de UV están entre 0-1.
 +
Image:Unity3d_textura_1C.JPG| Figura 3D sin texturas aplicadas.
 +
Image:Unity3d_textura_1B.JPG| Figura 3D sobre la que se le han aplicado las texturas anteriores.
 +
</gallery>
 +
 
 +
 
 +
 
 +
<br />
 +
* Para poder hacer el proceso anterior, 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 :) )
 
: Veamos un ejemplo con un cubo (algo supongo que todos hemos hecho alguna vez :) )
Línea 156: Línea 186:
 
:* 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.
 
:* 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 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'''.
+
:* Unity recomienda utilizar el formato de fichero '''.tga''' (recomendado por Unity) o '''.png''' para guardar texturas con información de transparencia (canal alfa). En caso de no necesitar tener transparencias, hacer uso del formato '''.jpg'''.
  
 
[[Imagen:Unity3d_textura_2B.JPG|300px|center]]
 
[[Imagen:Unity3d_textura_2B.JPG|300px|center]]
Línea 170: Línea 200:
  
 
: Una vez hecho, vamos a incorporar a nuestro proyecto texturas para el planeta Tierra (vienen otras texturas a mayores para crear planetas 'alienígenas').
 
: 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).
+
: Buscar en el asset store recursos para texturas de planetas (buscar por 'Planet Shader and Shadowing' y filtrar solo los recursos gratuitos).
  
 
* Aparecerá el siguiente recurso:
 
* Aparecerá el siguiente recurso:
Línea 187: Línea 217:
 
Image:Unity3d_textura_8.jpg| Botón derecho sobre la ventana jerárquica y añadimos un objeto 3D, una esfera.  
 
Image:Unity3d_textura_8.jpg| Botón derecho sobre la ventana jerárquica y añadimos un objeto 3D, una esfera.  
 
Image:Unity3d_textura_9.JPG|  Debemos de colocarla en una zona que sea visible por la cámara. Podéis pulsar sobre la cámara para ver un 'preview' en la vista de escena o pulsar sobre la pestaña 'Game' en la vista de escena.
 
Image:Unity3d_textura_9.JPG|  Debemos de colocarla en una zona que sea visible por la cámara. Podéis pulsar sobre la cámara para ver un 'preview' en la vista de escena o pulsar sobre la pestaña 'Game' en la vista de escena.
−
Image:Unity3d_textura_10.JPG| 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 [http://wiki.cifprodolfoucha.es/index.php?title=UNITY_El_entorno_de_desarrollo#Ventana_Inspector 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'.
+
Image:Unity3d_textura_10.JPG| 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 [http://wiki.cifprodolfoucha.es/index.php?title=UNITY_El_entorno_de_desarrollo#Ventana_Inspector 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'. Lo que hace Unity es crear un material (lo veremos después) y asociar a dicho material la textura que hemos arrastrado.
−
Image:Unity3d_textura_11.jpg| Si quisiéramos volver a la textura por defecto, pulsaremos sobre la rueda dentada de la sección y escogeremos la opción '''Reset''' o simplemente arrastramos otra textura diferente y Unity ya se encargar de reemplazarla.
+
Image:Unity3d_textura_10b.JPG| Podéis comprobar como se ha creado una nueva carpeta de nombre 'Materials' y dentro de ella se encuentra el material que Unity asocia a la esfera y sobre el que se encuentra la textura asociada.
 +
Image:Unity3d_textura_11.jpg| Si quisiéramos volver al material por defecto, es decir, al material sin textura asociada,pulsaremos sobre la rueda dentada de la sección y escogeremos la opción '''Reset''' o simplemente arrastramos otra textura diferente y Unity ya se encargará de reemplazarla.
 
</gallery>
 
</gallery>
  
Línea 205: Línea 236:
  
  
 +
 +
<br />
 +
 +
==Importando nuevas texturas==
 +
 +
* Para importar una nueva textura a Unity solamente tenemos que 'arrastrar' la imagen a la carpeta '''Assets''' de Unity.
 +
 +
: Por ejemplo, podemos ir al sitio web https://3dtextures.me y descargar alguna de las texturas (veremos los diferentes tipos cuando expliquemos los materiales). Por ejemplo [https://drive.google.com/drive/folders/1JIGf3P6lmKR3JC1h-5h95zMBPNIYMLdr en este enlace] descargar la imagen '''Snow_004_DISP.png'''.
 +
 +
<gallery caption="Importando una nueva textura" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_texturas_import_1.JPG| Arrastramos la textura que queremos incorporar a la carpeta Assets del Project Window.
 +
Image:Unity3d_texturas_import_2.JPG| Seleccionamos la textura importada y podemos comprobar el tamaño de la imagen (1024x1024), el tipo de compresión y el formato de color (RGB) así como el tamaño que ocupa. Indicar que dicho tamaño puede ser modificado en la propiedad '''Max Size'''.
 +
Image:Unity3d_texturas_import_3.JPG| Si cambiamos el tamaño de la textura, debemos pulsar el botón '''Apply'''. Indicar que el tamaño estará en función del nivel de zoom que vayamos a tener sobre dicha textura. Así, si la textura está asociada a un GameObject que siempre se va a ver a una distancia, podríamos poner un tamaño pequeño, mientras que si vamos a estar muy cerca necesitaremos un tamaño grande. Disponemos de otros parámetro como el nivel de calidad de la compresión, el algoritmo y formato utilizado para el mismo.
 +
Image:Unity3d_texturas_import_4.JPG| Dependiendo de la instalación de Unity, podremos generar el juego para diferentes plataformas. En función del soporte instalado, dispondremos de dichas plataformas a la derecha del botón 'Default'. En el ejemplo, tenemos las plataformas PC/Linux/Mac y WebGL. Podemos indicar un tamaño concreto para cada una de las plataformas, optimizando el tamaño de las texturas en función de la plataforma a correr. Por ejemplo, en móviles, el tamaño de las texturas suele ser más pequeño.
 +
Image:Unity3d_texturas_import_5.JPG| Cuando importamos nuevas texturas podemos establecer el tipo de textura. Normalmente dejaremos 'default', pero veremos en el tema de materiales que tendremos que escoger el tipo Normal Map para realizar ciertos efectos.
 +
</gallery>
 +
 +
* Podemos consultar todas las opciones disponibles [https://docs.unity3d.com/Manual/class-TextureImporter.html en este enlace].
 +
 +
 +
<br />
 +
==Explicación técnica==
 +
 +
* Las texturas son los gráficos que se 'pegan' sobre cada una de las superficies de una figura 3D.
 +
: Por lo tanto trabajamos con imágenes 2D las cuales 'pegamos' a figuras 3D.
 +
 +
* Ya vimos en un apartado anterior como se realiza este proceso.
 +
 +
: Al igual que en el espacio disponemos de coordenadas x,y,z para situar nuestros GameObjects, las texturas tienen su propio espacio y se denomina '''UV'''
 +
 +
[[Imagen:Badlogic.jpg|300px|center]]
 +
 +
 +
* Cuando trabajamos con texturas, establecemos su posición en base a dos coordenadas que se <u>encuentran entre los valores [0-1]</u>
 +
[[Imagen:LIBGDX_UD4_Mesh_8.jpg|300px|center]]
 +
 +
 +
* Si queremos que dicha textura se dibuje sobre un triángulo tendremos que establecer para <u>cada uno de los vértices del triángulo</u> que posición de la textura se tiene que dibujar:
 +
[[Imagen:LIBGDX_UD4_Mesh_9.jpg|300px|center]]
 +
 +
 +
: Esto dará como resultado lo siguiente:
 +
[[Imagen:LIBGDX_UD4_Mesh_10.jpg|300px|center]]
 +
 +
 +
 +
<br />
 +
 +
=Propiedades de las texturas en Unity=
 +
 +
* Más información en https://docs.unity3d.com/Manual/class-TextureImporter.html.
 +
 +
 +
* Cuando seleccionamos una textura en Unity, en la Inspector Window aparecen una serie de propiedades:
 +
[[Imagen:Unity3d_textura_35.jpg|500px|center]]
 +
 +
 +
<br />
 +
* Veamos las más importantes, y el resto las iremos viendo a lo largo de la Wiki a medida que las vayamos necesitando.
 +
 +
* La primera propiedad es el '''tipo de textura'''.
 +
[[Imagen:Unity3d_textura_36.jpg|300px|center]]
 +
 +
: Normalmente emplearemos la opción 'default', pero [http://wiki.cifprodolfoucha.es/index.php?title=UNITY_Materiales#Propiedades_de_los_materiales_aplicados_a_Standard_Shader veremos en esta Wiki] como las texturas que están asociadas los materiales para que la luz se comporte de una forma determinada, deben ser de tipo 'Normal Map', o que las [http://wiki.cifprodolfoucha.es/index.php?title=Unity_Dise%C3%B1o_de_la_Interface_de_Usuario texturas asociadas a la interface de usuario] deben ser de tipo Editor GUI...
 +
 +
 +
* Propiedad '''alfa source'''.
 +
[[Imagen:Unity3d_textura_37.jpg|300px|center]]
 +
: Si nuestra textura tiene transparencias (canal alfa), podemos dejar la opción por defecto.
 +
: En caso de que no tenga, podemos seleccionar la opción 'None'
 +
: Si no trae canal alfa pero queremos que Unity genere dicho canal a partir de las tonalidades de grises, escogeremos la opción 'From Gray Scale'.
 +
 +
 +
* Propiedad '''Wrap Mode'''.
 +
[[Imagen:Unity3d_textura_38.jpg|300px|center]]
 +
: Esta propiedad indica si queremos que la textura pueda repetirse cuando está 'asociada' a una superficie de un GameObject. Por ejemplo, cuando tenemos una textura que representa un 'trozo' de terreno y queremos asociarla a un plano muy extenso y queremos que se repita, tendremos que poner el valor de la propiedad a 'Repeat'. Veremos un ejemplo práctico de esto en el [http://wiki.cifprodolfoucha.es/index.php?title=Unity_Recursos:_Editor_de_Terrenos editor de terrenos].
 +
 +
 +
* Propiedad '''MaxSize'''.
 +
[[Imagen:Unity3d_textura_39.jpg|300px|center]]
 +
 +
: Podemos observar en la parte baja (si no os aparece tenéis que 'arrastrar' hacia arriba la doble línea que aparece en la parte baja al lado del nombre) que la textura tiene un tamaño en píxeles de 1024x1024 es de tipo RGB, está comprimida haciendo uso del [https://docs.microsoft.com/en-us/windows/desktop/direct3d11/bc6h-format algoritmo BC6H] y que ocupa 1,3MB.
 +
: Normalmente trabajaremos con la resolución más alta y será Unity el que la comprima al tamaño adecuado.
 +
: Como tamaño máximo de la textura, se suele poner el doble del tamaño de la textura (1024x2 = 2048), pero si no es necesario, podremos cambiar y poner un tamaño menor, ahorrándonos mucho espacio.
 +
: Indica que estamos en la opción '''default''' esto quiere decir, que las modificaciones que hagamos se aplicarán a todas las plataformas para las que generemos el juego, pero podemos personalizar estas opciones para cada plataforma concreta.
 +
[[Imagen:Unity3d_textura_40.jpg|300px|center]]
 +
: Las plataformas que aparecen dependerá de las escogidas cuando instalamos Unity.
 +
 +
 +
 +
 +
<br />
 +
* <u>Notas:</u>
 +
:* 'MipMaps' son una versión en pequeño de las texturas, cuando las texturas aparecen muy pequeñas al estar alejada la cámara de ellas.
 +
:* 'Filter Mode' indica como se modifica la textura cuando sufre deformaciones al estar asociada a un modelo 3D que haga que se estire.
 +
:* 'Aniso Level' es un parámetro que da una mayor calidad a la textura y normalmente se usa para las texturas asociadas al suelo y al terreno.
 +
:* Podemos consultar [https://docs.unity3d.com/Manual/class-TextureImporterOverride.html en este enlace] los diferentes formatos de compresión empleados en las diferentes plataformas.
 +
 +
 +
 +
 +
<br />
 +
 +
=Avanzado=
  
 
<br />
 
<br />
Línea 271: Línea 406:
 
Image:Unity3d_textura_34.JPG| Seleccionamos el modelo importado, escogemos 'Materials' y seleccionamos las dos texturas. Debemos de recordar '''presionar el botón Apply''' una vez seleccionadas. Ahora ya podemos arrastrar cuantas veces queramos el modelo importado que aparecerá con las texturas asociadas.
 
Image:Unity3d_textura_34.JPG| Seleccionamos el modelo importado, escogemos 'Materials' y seleccionamos las dos texturas. Debemos de recordar '''presionar el botón Apply''' una vez seleccionadas. Ahora ya podemos arrastrar cuantas veces queramos el modelo importado que aparecerá con las texturas asociadas.
 
</gallery>
 
</gallery>
 +
  
  
 
<br />
 
<br />
  
−
=Avanzado: Conceptos para programadores=
+
 
 +
 
 +
<br />
 +
==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.
 
* Lo que viene a continuación son unas explicaciones teóricas para los alumnos que realizan el ciclo de Programación de aplicaciones multiplataforma.
Línea 283: Línea 422:
  
 
<br />
 
<br />
−
==Shaders==
+
===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.
 
* 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.
Línea 309: Línea 448:
 
* 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.
 
* 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'''.
 
: Esta herramienta es el '''Shader Graph Editor'''.
−
: Tenéis [https://blogs.unity3d.com/es/2018/02/27/introduction-to-shader-graph-build-your-shaders-with-a-visual-editor/ en este enlace] información y ejemplos sobre dicha herramienta.
+
: Tenéis [https://docs.unity3d.com/Packages/com.unity.shadergraph@4.6/manual/Getting-Started.html en este enlace] información y ejemplos sobre dicha herramienta.
 
: Vídeos:
 
: Vídeos:
 
:* En [https://www.youtube.com/watch?v=1mW3T-Oritw este enlace] tenéis un vídeo explicativo de su funcionamiento.
 
:* En [https://www.youtube.com/watch?v=1mW3T-Oritw este enlace] tenéis un vídeo explicativo de su funcionamiento.
Línea 323: Línea 462:
 
<br />
 
<br />
  
−
==Colores==
+
===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 <u>entera</u> se dibuja del color indicado.
+
: En OPENGL se puede establecer el color en cada uno de los vértices de cualquier figura 3D. Si todos los vértices tienen el mismo color, la superficie <u>entera</u> se dibuja del color indicado.
 
: Si cada vértice tiene un color diferente, se produce un degradado de un color al otro.
 
: Si cada vértice tiene un color diferente, se produce un degradado de un color al otro.
  
 +
* Veamos un ejemplo de programación en Unity en el que modificamos los colores de cada vértice, poniendo los vértices pares a rojo y los impares a amarillo.
 +
: Previamente hay que crear un material (lo veremos posteriormente) y cambiar el tipo de shader de 'Standard' (que no soporta la asignación de colores a vértices) a uno de tipo '''Particles'''.
  
−
 
+
<gallery caption="Cambiando el tipo de shader" widths="350" heights="300px" perrow="2">
−
 
+
Image:Unity3d_texturas_vertex_colores_1.JPG| Creamos un nuevo material (veremos en otra sección para que sirven)
−
<br />
+
Image:Unity3d_texturas_vertex_colores_2.JPG| Una vez cambiado el nombre, en la ventana Inspector cambiamos el tipo de Shader a uno de tipo 'Particles'.
−
==Texturas==
+
Image:Unity3d_texturas_vertex_colores_3.JPG| Arrastramos el material a una figura cualquiera previamente añadida a la escena.
−
 
 
−
<br />
 
−
==Materiales==
 
−
 
 
−
===Introducción===
 
−
 
 
−
* Máis información en [https://docs.unity3d.com/Manual/Materials.html 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.
 
−
 
 
−
 
 
−
 
 
−
 
 
−
<br />
 
−
===Creando un material===
 
−
 
 
−
*
 
−
 
 
−
 
 
−
<br />
 
−
===Normal Map===
 
−
 
 
−
* Alguna de las imágenes de esta sección han sido obtenidas [https://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html 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:
 
−
 
 
−
<gallery caption="Normal Map aplicado a un cilindro" widths="350" heights="300px" perrow="2">
 
−
Image:Unity3d_normalmap_1.JPG| Mesh formado por un cilindro.
 
−
Image:Unity3d_normalmap_2.JPG| Al no tener un 'Normal Map' definido, la luz se reflejará en base a la forma 3D de la figura.
 
−
</gallery>
 
−
 
 
−
: 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:
 
−
[[Imagen:Unity3d_normalmap_3.JPG|400px|center]]
 
−
 
 
−
: 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:
 
−
[[Imagen:Unity3d_normalmap_4.JPG|400px|center]]
 
−
 
 
−
 
 
−
 
 
−
* 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:
 
−
<gallery caption="Normal Map con formas aplicado a un cilindro" widths="350" heights="300px" perrow="2">
 
−
Image:Unity3d_normalmap_5.JPG| Un ejemplo de 'Normal Map' con un texto y unas formas.
 
−
Image:Unity3d_normalmap_6.JPG| Normal Map aplicado a un cilindro.
 
 
</gallery>
 
</gallery>
  
  
−
* 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.
+
* Ahora creamos un nuevo script con el siguiente código y lo asociamos a la figura 3D que tiene asociado el shader.
 +
<syntaxhighlight lang="java" line enclose="div" highlight="">
 +
    void Start()
 +
    {
 +
        Mesh mesh = GetComponent<MeshFilter>().mesh;
 +
        Vector3[] vertices = mesh.vertices;
  
 +
        // create new colors array where the colors will be created.
 +
        Color[] colors = new Color[vertices.Length];
  
 +
        for (int i = 0; i < vertices.Length; i++)
 +
        {
 +
            if (i % 2 == 0)
 +
                colors[i] = Color.red;
 +
            else
 +
                colors[i] = Color.yellow;
 +
        }
  
 +
        // assign the array of colors to the Mesh.
 +
        mesh.colors = colors;
 +
    }
 +
</syntaxhighlight>
  
  
−
* <u>'''Nota:'''</u>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'.
+
* Al ejecutar el juego podemos comprobar como se produce un degradado desde el color rojo al amarillo en ciertas caras del cubo:
−
: 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.
+
[[Imagen:Unity3d_texturas_vertex_colores_4.JPG|500px|center]]
  
  
  
−
* 'Normal Map' es un tipo de [https://es.wikipedia.org/wiki/Mapeado_topol%C3%B3gico Bump Maps], el cual es una técnica de programación para dar un aspecto rugoso a superficies.
 
−
: Dentro de <u>Bump Maps</u> tenemos dos tipos de mapas:
 
−
:* '''Normal Maps''' , el cual es el visto hasta ahora. Cada pixel de esta textura indica la dirección que tiene que seguir la luz cuando se refleja sobre su superficie.
 
−
:* '''Hieght Maps''', guarda la misma información que el anterior pero de forma diferente. En este tipo de mapa se usa una textura en blanco y negro, la cual indica la elevación que tiene que tener cada pixel en la textura.
 
  
−
[[Imagen:Unity3d_normalmap_17.JPG|400px|center]]
 
  
  
  
−
* Podéis descargar ejemplos de texturas junto con su 'normal map' desde [https://3dtextures.me/ https://3dtextures.me/]
 
 
<br />
 
<br />
−
 
+
'''[https://wiki.cifprodolfoucha.es/index.php?title=Programacion_de_videojuegos_con_UNITY3D#UNIDAD_2:_Conceptos_b.C3.A1sicos_3D Enlace a la página principal del curso]'''
−
====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.
 
−
Image:Unity3d_normalmap_16.JPG| Podemos comprobar la diferencia con respecto a no tener un 'Normal Map' aplicado.
 
−
</gallery>
 
−
 
 
−
 
 
−
<br />
 
−
 
 
−
====Creando un Normal Map====
 
−
 
 
−
* Vamos a ver un ejemplo haciendo uso del [https://www.gimp.org/ programa GIMP].
 
−
: Para poder crear un Normal Map debemos descargarnos un 'plugin' para Gimp deste [https://code.google.com/archive/p/gimp-normalmap/downloads este enlace].
 
−
 
 
−
<gallery caption="Instalando el plugin NormalMap para Gimp" widths="350" heights="300px" perrow="2">
 
−
Image:Unity3d_normalmap_8.JPG| Una vez descargado y descomprimido podemos abrir el archivo '''readme.txt'''. En el se indica lo que hay que hacer.
 
−
Image:Unity3d_normalmap_9.JPG | Copiamos los 3 archivos con extensión '''.dll''' al directorio indicado.
 
−
Image:Unity3d_normalmap_10.JPG | Copiamos el archivo '''normalmap.exe''' al directorio indicado y lanzamos la aplicación de Gimp.
 
−
</gallery>
 
−
 
 
−
 
 
−
* Existen en Internet multitud de páginas que muestran como crear un Normal Map en Gimp.
 
−
: Un ejemplo es [https://www.youtube.com/watch?v=X0Zr_nHwj3Q este vídeo].
 
−
: Instrucciones concretas de cómo crear un Normal Map [https://developer.valvesoftware.com/wiki/Normal_Map_Creation_in_The_GIMP en este enlace].
 
−
 
 
−
 
 
−
* Recursos a descargar:
 
−
:* El archivo de textura de madera desde: [https://3dtextures.me/2018/04/27/old-wood-001/ https://3dtextures.me/2018/04/27/old-wood-001/].
 
−
:: Solo descargar la textura. El enlace del mismo es [https://meocloud.pt/link/985fb169-076e-4842-adc3-a30a32948ccd/Old_Wood_001_SD/ https://meocloud.pt/link/985fb169-076e-4842-adc3-a30a32948ccd/Old_Wood_001_SD/].
 
−
:* La imagen que vamos a emplear para crear el Normal Map. Es una imagen creada con GIMP, podéis crear una propia personalizada: [[Media:Unity3D_normalmap_ej_1.png]]
 
−
 
 
−
 
 
−
: Lo que vamos a obtener será lo siguiente:
 
−
[[Imagen:Unity3d_normalmap_ej12.JPG|500px|center]]
 
−
 
 
−
 
 
−
 
 
 
<br />
 
<br />
−
<gallery caption="Creando un Normal Map propio" widths="350" heights="300px" perrow="2">
 
−
Image:Unity3d_normalmap_ej3.JPG| Con la imagen 'Unity3D_normalmap_ej_1.png' cargada en Gimp lo quitamos los colores para dejarla en tonos de grises (necesario para obtener el 'Normal Map'.
 
−
Image:Unity3d_normalmap_ej2.JPG| Escogemos la opción '''NormalMap'''.
 
−
Image:Unity3d_normalmap_ej4.JPG| Cambiamos 'filter' y 'scale' hasta obtener el efecto deseado. Normalmente se debe marcar la opción 'wrap'. Si pulsamos sobre el botón '3D Preview' podemos ver como quedaría sobre una figura 3D. Podemos rotar dicha figura manteniendo pulsado el botón del ratón y movemos el mismo.
 
−
Image:Unity3d_normalmap_ej5.JPG| Así quedaría la imagen una vez aplicado las configuraciones del Normal Map.
 
−
Image:Unity3d_normalmap_ej6.JPG| Como se comenta [https://developer.valvesoftware.com/wiki/Normal_Map_Creation_in_The_GIMP en este enlace] es necesario realizar un ajuste antes de guardar el Normal Map. Debemos ir a la sección de canales y desmarcar el canal azul (no aparece el texto).
 
−
Image:Unity3d_normalmap_ej7.JPG| Debemos ir a la opción de 'Balance del color'.
 
−
Image:Unity3d_normalmap_ej8.JPG| Debemos dejar a 0 el color Amarillo y a 1 el color rojo y verde.
 
−
Image:Unity3d_normalmap_ej9.JPG| Ahora ya podemos exportar la imagen que va a conforma nuestro 'Normal Map'.
 
−
Image:Unity3d_normalmap_ej10.JPG| La exportamos con formato '''.jpg'''.
 
−
Image:Unity3d_normalmap_ej11.JPG| Dejamos las opciones por defecto.
 
−
Image:Unity3d_normalmap_ej12.JPG| Ahora solo tenemos que crear un modelo 3D en Unity (en este caso un Cubo) y arrastrar la textura y el 'Normal Map' como hicimos en el caso anterior. Arrastramos la textura al objeto 3D y se creará un material. Vamos a sus propiedades y cambiamos el 'Normal Map' por el creado en el programa Gimp.
 
−
</gallery>
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
  
  

Revisión actual del 21:20 19 ene 2026

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 (Unity permite emplear sprites con otras formas, como círculos,...).
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.


  • Relacionado con el concepto de Textura, Unity emplea Materiales que son los que van a llevar asociada la textura. Posteriormente Unity 'asocia' el material a la figura. Lo veremos en la sección de Materiales de esta misma Wiki.


  • Para trabajar con texturas podemos hacer uso de varios programas como:


  • A partir de la versión 2018.1, Unity incorpora una nueva forma de renderizar las texturas denominada URP (Universal Render Pipeline).
Entre las ventajas de usar este tipo de renderizado tenemos:
  • Soporta técnicas avanzadas de sombreado
  • Puede manejar texturas de mayor resolución más eficientemente que los pipelines más antiguos como el Built-In Render Pipeline de Unity.
  • Permite una gestión más eficiente de los recursos gráficos, lo que es crucial para el rendimiento en dispositivos con recursos limitados.
  • Puedes utilizar diferentes configuraciones y herramientas que te permiten controlar cómo se renderizan las texturas en diferentes dispositivos, adaptándose así a las necesidades específicas de cada plataforma.


Cuando creamos un proyecto nuevo, podemos escoger si vamos a hacer uso del nuevo sistema de renderizado o si seguimos con el antiguo.
En función de esta elección tendremos que tener en cuenta que a la hora de importar los paquetes de Unity o crear/usar materiales debemos de realizar unos ajustes para que se visualicen correctamente.
Lo indicaré cuando veamos los materiales.

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:
Información obtenida del libro Beginning Android 4 Games


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.
Dos de los más conocidos son los formatos JPEG y PNG.
  • 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,...


Información obtenida del libro 'Beginning Android 4 Games'


Si disponemos de un fondo y queremos que el personaje pase por dicho fondo, tendríamos este efecto:
Imagen superpuesta. El color blanco aparece alrrededor del gráfico.


  • 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:
Imágenes superpuestas. El color blanco tiene un nivel de transparencia de 0.


  • IMPORTANTE: Si la imagen necesita transparencias no podemos guardarla en el formato JPG.
Obligatoriamente tendría que ser
  • Formato PNG: Imagen comprimida sin pérdida de calidad. Algunas imágenes con transparencias no son importadas correctamente.
  • Formato TGA (es el que recomienda UNITY): No comprime la imagen. Las transparencias siempre son importadas correctamente.


  • Para hacer un color transparente en GIMP:
Cambiando unha cor a transparente



  • Desde GIMP podemos ver los diferentes canales y visualizarlos de forma independiente:
Unity3d texturas gimp 1.jpg


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.



  • Para poder hacer el proceso anterior, 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 :) )
Unity3d textura 1.jpg
  • 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:
Unity3d textura 5.JPG
La podemos poner sobre la esfera de esta forma:
Unity3d textura 5B.JPG


  • Veamos otro con una 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 (recomendado por Unity) o .png para guardar texturas con información de transparencia (canal alfa). En caso de no necesitar tener transparencias, hacer uso del formato .jpg.
Unity3d textura 2B.JPG




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 Shader and Shadowing' y filtrar solo los recursos gratuitos).
  • Aparecerá el siguiente recurso:
Unity3d textura 6.JPG
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'.
Unity3d textura 7.JPG


  • Vamos a crear una esfera y a añadir la textura indicada:


  • 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



Importando nuevas texturas

  • Para importar una nueva textura a Unity solamente tenemos que 'arrastrar' la imagen a la carpeta Assets de Unity.
Por ejemplo, podemos ir al sitio web https://3dtextures.me y descargar alguna de las texturas (veremos los diferentes tipos cuando expliquemos los materiales). Por ejemplo en este enlace descargar la imagen Snow_004_DISP.png.



Explicación técnica

  • Las texturas son los gráficos que se 'pegan' sobre cada una de las superficies de una figura 3D.
Por lo tanto trabajamos con imágenes 2D las cuales 'pegamos' a figuras 3D.
  • Ya vimos en un apartado anterior como se realiza este proceso.
Al igual que en el espacio disponemos de coordenadas x,y,z para situar nuestros GameObjects, las texturas tienen su propio espacio y se denomina UV
Badlogic.jpg


  • Cuando trabajamos con texturas, establecemos su posición en base a dos coordenadas que se encuentran entre los valores [0-1]
LIBGDX UD4 Mesh 8.jpg


  • Si queremos que dicha textura se dibuje sobre un triángulo tendremos que establecer para cada uno de los vértices del triángulo que posición de la textura se tiene que dibujar:
LIBGDX UD4 Mesh 9.jpg


Esto dará como resultado lo siguiente:
LIBGDX UD4 Mesh 10.jpg



Propiedades de las texturas en Unity


  • Cuando seleccionamos una textura en Unity, en la Inspector Window aparecen una serie de propiedades:
Unity3d textura 35.jpg



  • Veamos las más importantes, y el resto las iremos viendo a lo largo de la Wiki a medida que las vayamos necesitando.
  • La primera propiedad es el tipo de textura.
Unity3d textura 36.jpg
Normalmente emplearemos la opción 'default', pero veremos en esta Wiki como las texturas que están asociadas los materiales para que la luz se comporte de una forma determinada, deben ser de tipo 'Normal Map', o que las texturas asociadas a la interface de usuario deben ser de tipo Editor GUI...


  • Propiedad alfa source.
Unity3d textura 37.jpg
Si nuestra textura tiene transparencias (canal alfa), podemos dejar la opción por defecto.
En caso de que no tenga, podemos seleccionar la opción 'None'
Si no trae canal alfa pero queremos que Unity genere dicho canal a partir de las tonalidades de grises, escogeremos la opción 'From Gray Scale'.


  • Propiedad Wrap Mode.
Unity3d textura 38.jpg
Esta propiedad indica si queremos que la textura pueda repetirse cuando está 'asociada' a una superficie de un GameObject. Por ejemplo, cuando tenemos una textura que representa un 'trozo' de terreno y queremos asociarla a un plano muy extenso y queremos que se repita, tendremos que poner el valor de la propiedad a 'Repeat'. Veremos un ejemplo práctico de esto en el editor de terrenos.


  • Propiedad MaxSize.
Unity3d textura 39.jpg
Podemos observar en la parte baja (si no os aparece tenéis que 'arrastrar' hacia arriba la doble línea que aparece en la parte baja al lado del nombre) que la textura tiene un tamaño en píxeles de 1024x1024 es de tipo RGB, está comprimida haciendo uso del algoritmo BC6H y que ocupa 1,3MB.
Normalmente trabajaremos con la resolución más alta y será Unity el que la comprima al tamaño adecuado.
Como tamaño máximo de la textura, se suele poner el doble del tamaño de la textura (1024x2 = 2048), pero si no es necesario, podremos cambiar y poner un tamaño menor, ahorrándonos mucho espacio.
Indica que estamos en la opción default esto quiere decir, que las modificaciones que hagamos se aplicarán a todas las plataformas para las que generemos el juego, pero podemos personalizar estas opciones para cada plataforma concreta.
Unity3d textura 40.jpg
Las plataformas que aparecen dependerá de las escogidas cuando instalamos Unity.




  • Notas:
  • 'MipMaps' son una versión en pequeño de las texturas, cuando las texturas aparecen muy pequeñas al estar alejada la cámara de ellas.
  • 'Filter Mode' indica como se modifica la textura cuando sufre deformaciones al estar asociada a un modelo 3D que haga que se estire.
  • 'Aniso Level' es un parámetro que da una mayor calidad a la textura y normalmente se usa para las texturas asociadas al suelo y al terreno.
  • Podemos consultar en este enlace los diferentes formatos de compresión empleados en las diferentes plataformas.




Avanzado


Asociando nuevas texturas a objetos 3D

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:


  • 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.


  • Una vez creado el modelo en Wings realizamos el siguiente proceso:



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.






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:






Colores

En OPENGL se puede establecer el color en cada uno de los vértices de cualquier figura 3D. Si todos los vértices tienen el mismo color, la superficie entera se dibuja del color indicado.
Si cada vértice tiene un color diferente, se produce un degradado de un color al otro.
  • Veamos un ejemplo de programación en Unity en el que modificamos los colores de cada vértice, poniendo los vértices pares a rojo y los impares a amarillo.
Previamente hay que crear un material (lo veremos posteriormente) y cambiar el tipo de shader de 'Standard' (que no soporta la asignación de colores a vértices) a uno de tipo Particles.


  • Ahora creamos un nuevo script con el siguiente código y lo asociamos a la figura 3D que tiene asociado el shader.
 1     void Start()
 2     {
 3         Mesh mesh = GetComponent<MeshFilter>().mesh;
 4         Vector3[] vertices = mesh.vertices;
 5 
 6         // create new colors array where the colors will be created.
 7         Color[] colors = new Color[vertices.Length];
 8 
 9         for (int i = 0; i < vertices.Length; i++)
10         {
11             if (i % 2 == 0)
12                 colors[i] = Color.red;
13             else
14                 colors[i] = Color.yellow;
15         }
16 
17         // assign the array of colors to the Mesh.
18         mesh.colors = colors;
19     }


  • Al ejecutar el juego podemos comprobar como se produce un degradado desde el color rojo al amarillo en ciertas caras del cubo:
Unity3d texturas vertex colores 4.JPG





Enlace a la página principal del curso




-- Ángel D. Fernández González -- (2018).