Los shaders definen cómo un objeto se ve por sí mismo (sus propiedades materiales) y cómo reacciona a la luz. Debido a que los cálculos de iluminación deben estar integrados en el shader, y hay muchos tipos de luces y sombras posibles, escribir shaders de calidad que “sólo funcionan” sería una tarea complicada. Para hacerlo más fácil, Unity tiene Surface Shaders, donde todas las funciones de iluminación, sombreado, lightmapping, avance y entrega diferida son atendidas automáticamente.
Este documento describe las peculiaridades de la iluminación de Unity y el pipeline de rendering y lo que sucede detrás de las escenas de Surface Shaders.
La forma en que se aplica la iluminación y qué Passes del shader se utilizan depende de que cuál Rendering Path. Cada pass en un shader comunica su tipo de iluminación a través de Etiquetes Pass.
ForwardBase
y ForwardAdd
se utilizan.Deferred
pass se utiliza.PrepassBase
y PrepassFinal
passes se utilizan.Vertex
, VertexLMRGBM
y VertexLM
passes se utilizan.ShadowCaster
pass se utiliza.ForwardBase
pass renderiza ambiente, lightmaps, y una luz direccional principal y las luces (vertex/SH) no importantes una vez. El ForwardAdd
pass se utiliza para cualquier luz aditiva por pixel; una invocación por objeto iluminado por tal luz se hace. Mire Forward Rendering para detalles.
En forward rendering se utiliza, pero en un shader no tiene forward-suitable passes (i.e. ni los tipos de pass ForwardBase
ni ForwardAdd
están presentes), entonces ese objeto se renderiza como lo haría un Vertex Lit path, mirar abajo.
El pass Deferred
renderiza toda la información necesaria para la iluminación (en shaders incorporados: color difuso, color especular, suavidad,
normal del espacio del mundo, emisión). También agrega lightmaps, reflection probes e iluminación ambiental en el canal de emisión. Consulte Deferred Shading para obtener más detalles.
El pass PrepassBase
renderiza normales y el exponente especular; El pass PrepassFinal
produce el color final combinando texturas, iluminación y propiedades del material emisivo. Toda la iluminación en escena regular se realiza por separado en el espacio de la pantalla. Consulte Deferred Lighting para obtener más detalles.
Dado que la vertex lighting se utiliza con más frecuencia en plataformas que no soportan shaders programables, Unity no puede crear múltiples variantes shader internamente para manejar casos lightmapped vs. no lightmapped. Así que para manejar los objetos lightmapped y no lightmapped, varios passes tienen que ser escritos explícitamente.
Vertex
pass se utiliza para objetos no lightmapped. Todas las luces se renderizan a la vez, utilizando un modelo de iluminación de función fija OpenGL/Direct3D (Blinn-Phong)VertexLMRGBM
pass se utiliza para los objetos lightmapped, cuando los lightmaps están codificados RGBM (PC y consolas). No se aplica iluminación en tiempo real; Se espera combinar texturas con un lightmap.VertexLMM
pass se utiliza para los objetos lightmapped, cuando los lightmaps son codificados con doble LDR (plataformas móviles). No se aplica iluminación en tiempo real; Se espera combinar texturas con un lightmap.