Textura, material y shader#
Se confunden constantemente. La cadena es:
- Textura: una imagen (un JPG/PNG de madera, metal, ladrillo).
- Shader: el programa que decide cómo se dibuja la superficie (ver shaders).
- Material: la unión de ambos — un shader concreto con valores y texturas asignados. Es lo que arrastras sobre un objeto.
Un mismo shader (Lit de URP) genera infinitos materiales: madera, oro, plástico... cambiando sus texturas y parámetros.
Crear y aplicar un material#
Assets → Create → Material, se abre en el Inspector con el shader Universal Render Pipeline/Lit por defecto. Lo arrastras sobre el objeto (o a su Mesh Renderer). Sus campos principales:
- Base Map: la textura de color (también llamada albedo) + un tinte.
- Metallic / Smoothness: si la superficie es metálica y cómo de pulida (mate vs espejo).
- Normal Map: relieve falso (ver abajo).
- Emission: si la superficie emite luz propia (pantallas, lava, neón).
- Tiling / Offset: cuántas veces se repite la textura y su desplazamiento.
Los mapas PBR#
El renderizado moderno es PBR (Physically Based Rendering): la superficie se describe con varias texturas que representan propiedades físicas, y la luz se comporta de forma realista.
| Mapa | Qué describe |
|---|---|
| Albedo / Base Color | El color puro, sin luces ni sombras |
| Normal | Relieve: simula bultos y surcos sin más geometría |
| Metallic | Qué zonas son metal y cuáles no |
| Smoothness / Roughness | Cómo de pulida es (reflejos nítidos vs difusos) |
| Occlusion (AO) | Sombras de contacto en recovecos |
| Height | Profundidad para parallax |
Un normal map hace que una pared plana parezca tener ladrillos en relieve sin añadir un solo triángulo. Es la técnica que más aspecto da por menos coste. Impórtalo marcando Texture Type: Normal map o Unity lo interpretará como colores y se verá azulado.
Instancias: material vs sharedMaterial#
Igual que en shaders, cuidado al tocar materiales por código:
// Cambia el color SOLO de este objeto (crea una copia del material)
GetComponent<Renderer>().material.color = Color.red;
// Cambia el material COMPARTIDO (afecta a todos los que lo usan)
GetComponent<Renderer>().sharedMaterial.color = Color.red;Acceder a .material duplica el material para ese objeto (una llamada, una copia). Está bien para un caso puntual, pero para muchos objetos usa un MaterialPropertyBlock o cambia el sharedMaterial, o acabarás con cientos de materiales y draw calls. Ver reducir draw calls.
Errores frecuentes#
- Confundir textura con material: la textura es la imagen; el material la usa dentro de un shader.
- Importar un normal map sin marcar Normal map (se ve azulado y plano).
- Materiales en magenta: el shader no es compatible con el pipeline actual (URP). Convierte con Edit → Rendering → Materials → Convert....
- Tocar
.materialen muchos objetos y disparar draw calls sin querer.
Ponte a prueba#
Resumen#
Una textura es una imagen; un shader decide cómo se dibuja; un material los une con valores concretos (y es lo que aplicas al objeto). El renderizado moderno es PBR: describes la superficie con mapas (albedo, normal, metallic, smoothness, emission) que el shader Lit de URP combina para dar realismo. El normal map es el que más rinde por su coste. Al tocar materiales por código, cuidado con .material (clona): usa sharedMaterial o MaterialPropertyBlock para muchos objetos. Después, los shaders para efectos.