Diferencia entre revisiones de «Unity Luces»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 263: Línea 263:
 
Image:Unity3d_luces_36.jpg| Sobre la luz ambiental pulsamos la propiedad 'Culling Mask' y deselecionamos la capa 'SinLuzAmbiental'. Al hacerlo, su propiedad 'Culling Mask' pasará a tener el valor 'Mixed' y veremos que la casa ya no es iluminada por la luz ambiental. Solamente se ve afectada por la luz del SkyBox.
 
Image:Unity3d_luces_36.jpg| Sobre la luz ambiental pulsamos la propiedad 'Culling Mask' y deselecionamos la capa 'SinLuzAmbiental'. Al hacerlo, su propiedad 'Culling Mask' pasará a tener el valor 'Mixed' y veremos que la casa ya no es iluminada por la luz ambiental. Solamente se ve afectada por la luz del SkyBox.
 
</gallery>
 
</gallery>
 +
 +
 +
 +
 +
<br />
 +
=Sombras=
 +
 +
* Más información [https://docs.unity3d.com/Manual/ShadowOverview.html en este enlace].
 +
 +
 +
* Uno de los aspectos que tenemos que tener en cuenta en el uso de luces son las sombras generadas por esas luces.
 +
: El uso de sombras dará un realismo mucho mayor a la escena, pero tendremos que tener en cuenta la carga de CPU que también se genera e intentar minimizarla.
 +
 +
 +
* En el manejo de sombras van a participar dos GameObjects:
 +
:* El objeto que se va a iluminar.
 +
:* La luz.
 +
 +
:* Cada GameObject que se dibuja en la escena tiene un componente 'Mesh Renderer' con una sección específica de sombras:
 +
[[Imagen:Unity3d_luces_37.jpg|400px|center]]
 +
 +
::* Cast Shadown:
 +
:::* On: Indica que el GameObject va a generar sombras al ser iluminado (dependerá ahora de la configuración de la luz que ese objeto genera sombras).
 +
:::* Off: No genera sombras. Por ejemplo, en GameObjects muy pequeños sería una opción a considerar.
 +
:::* Two Sided: Usado para objetos con una geometría simple (de caras) como un Quad o Plano.
 +
[[Imagen:Unity3d_luces_38.jpg|400px|center]]
 +
:::* Shadows Only: Hace que se genere la sombra pero el objeto no se dibuja.
 +
 +
::* Receive Shadows: Es un CheckBox con el que indicamos si el Mesh va a recibir sombras del resto de GameObjects.
 +
:: En nuestro ejemplo, si seleccionamos el suelo (Plane) y desmarcamos esta opción, veremos que el <u>suelo deja de recibir las sombras del resto de GameObjects de la escena</u>.
 +
[[Imagen:Unity3d_luces_39.jpg|400px|center]]
 +
 +
 +
:* Cada Tipo de Luz que se utiliza en la escena tiene una propiedad 'Shadow Type':
 +
[[Imagen:Unity3d_luces_40.jpg|400px|center]]
 +
 +
::* Shadow Type:
 +
::* No Shadows: Indica que la luz no va a generar sombras. Podemos comprobarlo en el ejemplo, como la luz de la farola no genera sombras.
 +
::* Hard Shadows: Genera sombras con un menor coste de CPU pero con unos bordes en la sombra muy 'marcados' por el Mesh que lo genera, poco realistas, ya que las sombras, debido al aire y otras partículas se difumina.
 +
::* Soft Shadows: Mayor coste de CPU pero sombras más realistas.
 +
 +
 +
:: Veamos un ejemplo con la luz direccional que tenemos en la escena:
 +
<gallery caption="Modificando el tipo de sombras de la luz direccional" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_luces_41.jpg| Al seleccionar la luz direccional, el tipo de sombra por defecto es el de Soft Shadow. Para apreciar más las sombras vamos a aumentar la intensidad de la luz.
 +
Image:Unity3d_luces_42.jpg| Si escogemos la opción 'No Shadows' podemos comprobar como no se generan sombras por la luz ambiental.
 +
Image:Unity3d_luces_43.jpg| Si escogemos 'Hard Shadow' podemos ver como la sombra es exactamente igual que el Mesh. No se difumina.
 +
Image:Unity3d_luces_44A.jpg| Con este tipo de sombras disponemos de varios parámetros para ajustarla. '''Strength''': Valores desde 0-1, siendo 1 la sombra con mayor fuerza, perdiendo 'negrura' hasta llegar al valor 0. '''Resolution:''' Cada vez que se mueve la fuente de luz es necesario recalcular las sombras. Con este parámetro indicamos la calidad de la imagen sobre la que se va a generar la sombra. Cuanto más resolución, la sombra estará más definida pero el coste de CPU será más grande. La opción por defecto es la de 'Use Quality Settings' la cual se encuentra definida en la opción de menú '''Edit''' => '''Project Settings'''.
 +
Image:Unity3d_luces_44.jpg| Opción de menú '''Edit''' => '''Project Settings'''. Indicamos a nivel global (para todo el juego) cual es la calidad de los gráficos empleada en función de los tipos de plataforma que tengamos instalado.
 +
Image:Unity3d_luces_45.jpg| Por ejemplo, si marcamos 'Low Resolution' podemos comprobar como la sombra generada no es muy precisa, pero si estamos alejados puede que nos sirva.
 +
Image:Unity3d_luces_45B.jpg| El uso de los parámetros 'Bias' pueden ser consultados [https://docs.unity3d.com/Manual/ShadowOverview.html#LightBias en este enlace]. A afectos prácticos, el parámetro 'Bias' va a hacer que la sombra parta de un punto más elejado del Mesh. Debemos ajustarlo para que parta justo donde aparece la base de la cruz y que no le de sombra a la base de la cruz(en esta escena, claro).
 +
Image:Unity3d_luces_45C.jpg| Valor correcto. Si disminuímos mas el valor podemos comprobar como aparece una sombra sobre la base. El parámetro 'Normal Bias' hace referencia al grosor de la sombra. Con un valor más alto, el grosor será menor.
 +
Image:Unity3d_luces_46.jpg| El tipo de sombra 'Soft Shadow' intenta emular la sombra de una forma más real, haciendo que se difumine por la distancia. Al igual que en el caso anterior, podemos modificar la 'fuerza' de la sombra haciendo que sea más oscura o difuminada con el parámetro 'Strength' (dependerá de la ambientación que queramos darle a la escena).
 +
</gallery>
 +
 +
 +
:<u>'''Nota:'''</u> Debemos siempre escojer la opción que con menor consume de CPU nos permite tener una escena lo más realista posible.
 +
 +
 +
 +
 +
 +
  
  
Línea 268: Línea 331:
 
* Luces aplicadas a capas
 
* Luces aplicadas a capas
  
−
* Sombras
+
 
  
 
* Cookies
 
* Cookies

Revisión del 08:37 19 jul 2019

Introducción

  • La correcta iluminación de una escena es uno de los aspectos más importantes en el desarrollo de un juego y también uno de los recursos que puedo consumir mayor cantidad de recursos.
Como norma general se recomiendo no abusar del número de luces. Veremos más adelante los tipos de luces, pero se recomienda no tener más de:
  • 4 Directional Light
  • 512 Punctual Lights (point o spot light)
  • 64 Area Lights


  • Las luces y por tanto sus efectos (objetos más iluminados, sombras,...) deben ser calculados por el ordenador.
Estos efectos pueden:
  • O estar previamente calculados y 'guardados' en la escena, por lo que cuando se inicie el juego dichos efectos aparecen, pero no mostrarían modificaciones (por ejemplo, al mover un objeto, la sombra quedaría en la misma posición).
Esta es la técnica empleada en las películas, donde todas las luces y sus efectos son generados por uno o múltiples ordenadores y guardados junto a la película.
  • O estar calculadas en 'Real Time', de tal forma que de manera continua se 're-calculan' los efectos-sombras sobre todos los objetos de la escena (es la opción que más recursos consume).


  • En el desarrollo de videojuegos normalmente se emplean las dos técnicas, de tal forma que se pre-calculan las sombras-efectos sobre aquellos objetos de la escena que no van a modificar su posición-tamaño (proceso que se conoce con el nombre de Lighting Bake y sobre aquellos objetos que se mueven, las sombras-efectos se calculan dinámicamente.


  • Podéis ver en este vídeo la importancia del uso de las luces para conseguir una ambientación correcta en el juego.
En este vídeo se hace uso de una técnica que genera previamente todas las posibles 'rutas' que puedan tener las fuentes de luz sobre los objetos al mover la cámara (una especie de mezcla de las dos técnicas anteriores).
Unity3d luces 1.jpg




  • Para explicar los tipos de luces vamos a construir una nueva escena. La nueva escena tendrá de nombre ESCENA_UD3_Luces.
  • Creamos un nuevo material para el suelo.
https://meocloud.pt/link/4bf89dc3-a3b0-421a-90c5-b9f8ec9ca3ed/Grass_003_SD/
Unity3d luces 0.jpg
Descargamos en formato fbx y lo importamos a nuestro proyecto, como ya vimos en una sección de esta wiki



Tipos de luces

  • Veremos a continuación los diferentes tipos de luces que permite utilizar Unity y sus principales características.



Directional Light-SkyBox

  • Este tipo de luz se crea por defecto al iniciar un proyecto en Unity.
Unity3d luces 2.jpg
  • Una luz ambiental se caracteriza por:
  • Estar en un punto en el espacio. Este tipo de luz se aplica a toda la escena y por lo tanto no importa donde se coloque. El efecto será el mismo.
  • Tener una dirección, que indica la dirección de los rayos de luz, especificada por su rotación.
Viene a ser como los rayos del sol.
Nota: Podemos rotar dicha luz para ver como las sombras de la escena se modifican...
  • Rotando una luz ambiental
  • Luz ambiental con una rotación determinada. Fijarse en la posición de las sombras.

  • Luz ambiental rotada en el eje X. Las sombras han cambiado de posición.


    • Asociado al GameObject se encuentra un componente Light con ciertas propiedades de la luz:
    Unity3d luces 5.jpg
    • Check: Si desactivamos el check, la escena pasará a no tener luz ambiental, por lo que todo quedará oscurecido.
    • Type: Indica el tipo de luz. Veremos posteriormente los diferentes tipos. Ahora mismo marca el tipo de luz => Directional
    • Color: El color de los rayos.
    • Mode: Lo veremos después, pero indica si queremos que los efectos producidos por la luz ambiental (sombras, brillos,...) se calculen previamente (baked) o en tiempo real (por defecto).
    • Intensity: Intensidad del brillo de la luz.
    • Indirect Multiplier: Indica la intensidad del brillo de la luz pero de la luz reflejada por otras superficies al aplicarle la luz ambiental.


    • Para darle un poco más de ambiente a la escena vamos a bajar la intensidad de la luz direccional:
    Unity3d luces 17.jpg



    • Relacionado con la luz ambiental disponemos del SkyBox.
    Hay una sección específica en la Wiki para quien quiera consultarla.
    El SkyBox es el 'espacio' que rodea nuestra escena y que viene a ser el horizonte de la misma.
    Por defecto, aparece el siguiente SkyBox cuando creamos un proyecto en Unity.
    Unity3d luces 6.jpg
    Como vemos es un horizonte que refleja un día despejado y con luz.
    Para ver el SkyBox en la vista escena debemos hacer lo siguiente:


    El SkyBox va a influir sobre el tipo de luz ambiental que se genera, ya que no sería lógico tener un SkyBox de una noche estrellada con una luz ambiental brillante.
    Además va a influir sobre el 'color' de dicha luz, aplicando una especie de 'tinte' a la misma.
    Si pulsamos sobre uno de los SkyBox descargados, podemos ver las propiedades de 'Tint Color' y exposición del SkyBox:
    Unity3d luces 8b.jpg




    Hagamos un ejemplo utilizando los ejemplos de SkyBox descargados previamente:
    Nota: Si queremos volver al SkyBox por defecto, debemos escoger la opción de menú Window => Rendering => Lighting Settings:
    Unity3d luces 11.jpg
    Aparece una ventana en la que podemos cambiar la opción Source por el SkyBox que queramos. El SkyBox por defecto se llama 'Default-SkyBox'.
    En esta sección solamente vamos a ver los aspectos más importantes en el uso de las luces. Más información sobre el SkyBox en esta sección de la Wiki




    Point Light

    • Las point light son puntos de luz los cuales emiten luz en todas las direcciones pero hasta un determinado alcance.



    • Como ejercicio añadir una luz a cada farola un Point Light y ajustarlo a vuestras preferencias.



    Spot Light

    • Emite la luz siguiendo una forma de cono.


    • Como ejercicio vamos a ajustar un SpotLight al modelo de linterna importado.
    Recordar siempre de partir de la posición (0,0,0) y rotación (0,0,0) en todos los modelos y una vez colocados-rotados correctamente, entonces añadirlos dentro de la jerarquía.
    Lo que queremos conseguir es lo siguiente:


    Creamos el siguiente Script:
     1 using UnityEngine;
     2 
     3 public class UD3_Luces_Mover_Linterna : MonoBehaviour
     4 {
     5     [SerializeField]
     6     private float velRotacion;
     7     [SerializeField]
     8     private float velTraslacion;
     9 
    10     private void Reset()
    11     {
    12         velRotacion = 30f;
    13         velTraslacion = 5f;
    14     }
    15 
    16     // Update is called once per frame
    17     void Update()
    18     {
    19         float valorXY = Input.GetAxis("Horizontal") * velRotacion * Time.deltaTime;
    20         transform.Rotate(valorXY * Vector3.up);
    21 
    22         float valorZ = Input.GetAxis("Vertical") * velTraslacion * Time.deltaTime;
    23         transform.Translate(transform.forward * valorZ,Space.World);
    24 
    25         
    26     }
    27 }
    
    Este script va a mover-rotar la cámara pulsando los cursores del teclado.


    Lo asociamos a la cámara y ejecutamos el juego:





    Area Light

    • Emite la luz siguiendo una forma de rectángulo/círculo.
    Es una especie de luz ambiental pero limitada a un rectángulo/cículo. Emite en todas direcciones pero sólo hacia uno de los lados del rectángulo/círculo que conforma la luz.




    Uso de capas (layers) con luces

    • Como comenté anteriormente, el uso de luces lleva consigo una mayor carga de CPU por parte del procesador, sobre todo por parte de luces en tiempo real, por lo que tenemos que intentar optimizar el uso de este tipo de luces.
    Una forma de hacerlo es determinar sobre qué objetos de la escena va a aplicarse una iluminación.
    Esto se consigue mediante el uso de capas (Layers).


    • El uso de capas también va a permitirnos tener escenas en las que:
    • Una determinada luz afecte sólo a un game object específico, por ejemplo a un personaje concreto dentro de la escena.
    • Hacer que todos los objetos de una habitación estén a oscuras excepto el techo o el suelo.
    • Vamos a preparar la escena y añadimos la 'Mediaval Fantasy House' importada previamente al proyecto.


    Unity3d luces 33.jpg


    • Ahora vamos a hacer que la luz ambiental 'no afecte' a la casa, haciendo que permanezca totalmente a oscuras.





    Sombras


    • Uno de los aspectos que tenemos que tener en cuenta en el uso de luces son las sombras generadas por esas luces.
    El uso de sombras dará un realismo mucho mayor a la escena, pero tendremos que tener en cuenta la carga de CPU que también se genera e intentar minimizarla.


    • En el manejo de sombras van a participar dos GameObjects:
    • El objeto que se va a iluminar.
    • La luz.
    • Cada GameObject que se dibuja en la escena tiene un componente 'Mesh Renderer' con una sección específica de sombras:
    Unity3d luces 37.jpg
    • Cast Shadown:
    • On: Indica que el GameObject va a generar sombras al ser iluminado (dependerá ahora de la configuración de la luz que ese objeto genera sombras).
    • Off: No genera sombras. Por ejemplo, en GameObjects muy pequeños sería una opción a considerar.
    • Two Sided: Usado para objetos con una geometría simple (de caras) como un Quad o Plano.
    Unity3d luces 38.jpg
    • Shadows Only: Hace que se genere la sombra pero el objeto no se dibuja.
    • Receive Shadows: Es un CheckBox con el que indicamos si el Mesh va a recibir sombras del resto de GameObjects.
    En nuestro ejemplo, si seleccionamos el suelo (Plane) y desmarcamos esta opción, veremos que el suelo deja de recibir las sombras del resto de GameObjects de la escena.
    Unity3d luces 39.jpg


    • Cada Tipo de Luz que se utiliza en la escena tiene una propiedad 'Shadow Type':
    Unity3d luces 40.jpg
    • Shadow Type:
    • No Shadows: Indica que la luz no va a generar sombras. Podemos comprobarlo en el ejemplo, como la luz de la farola no genera sombras.
    • Hard Shadows: Genera sombras con un menor coste de CPU pero con unos bordes en la sombra muy 'marcados' por el Mesh que lo genera, poco realistas, ya que las sombras, debido al aire y otras partículas se difumina.
    • Soft Shadows: Mayor coste de CPU pero sombras más realistas.


    Veamos un ejemplo con la luz direccional que tenemos en la escena:


    Nota: Debemos siempre escojer la opción que con menor consume de CPU nos permite tener una escena lo más realista posible.





    • Luces aplicadas a capas


    • Cookies
    • V04_02_V05 Final
    • Optimización de sombras (Ray Cast): Proyectors
    • Guardando una sombra precalculada: Baking



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