Version: 2019.4
Física en Unity 5.0
Otras notas de actualización para Unity 5.0

Shaders en Unity 5.0

Estas son recomendaciones para tener en cuenta cuando actualice proyectos de Unity 5 a Unity 5, si su proyecto utiliza código personalizado de shader.

Los Shaders ya no aplican un multiplicador de 2x de intensidad de luz

Los Shaders ya no aplicar un multiplicador 2x de la intensidad de luz. En vez, las luces son automáticamente actualizadas a ser el doble de brillantes. Esto crea más consistencia y simplicidad en los rigs de lights (luces). Por ejemplo, una directional light (luz direccional) alumbrando en una superficie blanca diffuse (difusa) tendrá el color exacto de la luz. La actualización no afecta la animación, por lo tanto, si usted tiene un valor de intensidad de animación usted tendrá que cambiar sus curvas de animación o código script y hacerlas el doble de grandes para obtener la misma apariencia.

En el caso de que haya shaders personalizados, dónde usted define sus propias funciones de iluminación , usted tendrá que quitar el *2 usted mismo.

// A common pattern in shader code that has this problem will look like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
// You need to fix the code so it looks more like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);

El aumento de counts (cuentas) del interpolator y de instrucción para algunos surface shaders

El pipeline de iluminación integrado en Unity 5 puede en algunos casos utilizar más interpolators (interpoladores) de coordenadas de texturas o counts de instrucciones de matemáticas (para obtener cosas como una escala no-uniforme mesh, un GI dinámico etc. funcionando). Algunos de sus surface shaders existentes podrá correr a texture coordinate (coordenadas de textura) o ALU instruction limits (limites de instrucción ALU), especialmente si estas tenían como objetivo el shader model 2.0 (Predeterminado). Agregando “#pragma target 3.0” puede funcionar alrededor de este problema. Ver http://docs.unity3d.com/Manual/SL-ShaderPrograms.html para referencia.

La Non-uniform mesh scale (escala no-uniforme mesh) debe ser tenida en cuenta en los shaders

En Unity 5.0, los meshes no-uniformes no son “pre-escalados” en el CPU ya. Esto significa que los vectores de normales y tangentes pueden ser no-normalizados en el vertex shader. Si usted está haciendo cálculos manuales de iluminación ahí, usted tendrá que normalizarlos. Si usted está utilizando los Surface Shaders de Unity, entonces todo el código necesario será generado para usted.

El manejo de Fog (niebla) fue cambiado

Unity 5.0 hace que el Fog (niebla) integrado funcione en WP8 y consolas, pero con el fin de lograr esto, nosotros hemos cambiado como el Fog es hecho. Para los surface shaders y fix function shaders, nada extra debe ser hecho - el fog va a ser automáticamente agregado (usted puede agregar “nofog” a la linea #pragma del surface shader para explícitamente hacer que no soporte fog).

Para vertex/fragment shaders escritos de manera manual, fog no sucede ya de manera automática. Usted necesita agregar #pragma multi_compile_fog y macros que manejen el fog para su código del shader. Revise el shader source integrado, por ejemplo Unlit-Normal para cómo hacerlo.

El canal Alpha de los Surface Shaders ha cambiado

Por defecto todos los surface shaders opaque (opacos) output 1.0 (“blanco”) al canal alpha ahora. Si usted quiere parar esto, utilice la opción “keepalpha” en la linea #pragma del surface.

Todos los alpha blended surface shaders (surface shaders mezclados con alpha) utiliza un componente alpha computado por la función de iluminación como factor de mezcla ahora (en vez de s.Alpha). Si usted está utilizando funciones de iluminación personalizadas, usted probablemente querrá agregar algo como “c.a = s.Alpha” hacia el final.

El Sorting ( clasificación) por indice de material ha sido quitado

Unity ya no clasifica por indice de material en el forward renderloop. Esto mejora el rendimiento ya que más objetos pueden ser renderizados sin cambios de estados entre ellos. Esto rompe la compatibilidad para contenido que se apoya en el indice de material como una manera de clasificación. En 4.x un mesh con dos materiales siempre iba a renderizar el primer material primero, y el segundo material de segundo. En Unity 5 esto no es el caso, el orden depende en qué reduce la mayoría de cambios de estado para renderizar la escena.

Fixed function TexGen (la función fija TexGen), texture matrices (matrices de textura) y algunos SetTexture combiner modes (modos del combinador SetTexture) fueron quitados

Unity 5.0 quito soporte para la funcionalidad de este fixed function shader :

  • Generación de coordenadas UV (comando TexGen).
  • Transformación de matrices UV (Un comando Matrix en una propiedad de textura o dentro de un SetTexture).
  • Modos del cominador SetTexture rara vez utilizados: signed add (a+-b), multiply signed add (ab+-c), multiply subtract (ab-c), producto punto (dot3, dot3rgba).

Cualquiera de los de arriba ahora hará nada, y el inspector del shader mostrará advertencias acerca de sus usos. Usted debería re-escribir los shaders afectados utilizando shaders vertex+fragment programables más bien. Todas las plataformas los soporta hoy en día, y no hay ventajas en absoluto para utilizar fixed function shaders.

Si usted tiene versiones viejas de paquetes Projector o Water shader en su proyecto, los shaders ahí podrían estar utilizando esta funcionalidad. Actualice los paquetes a la versión 5.0.

Mezclar partes del fixed function shader y shaders progamables ya no es permitido

La mezcla de shaders progamables y fixed function (e.g. la fixed function vertex lighting & pixel shader, o un vertex shader y texture combiners (combinadores de textura) ) ya no es soportado. No estaba funcionando en móviles, consolas o DirectX 11 igual. Este cambio de comportamiento requerido de que el Legacy/Reflective/VertexLit shader no haga esto - perdio soporte per-vertex specular; en el lado positivo se comporta ahora consistentemente entre plataformas.

El compilador D3D9 shade fue cambiado de Cg 2.2 a HLSL

En la mayoría esto debería ser transparente (simplemente resulta en menos bugs de codegen y un poco más rápido los shaders). Sin embargo, el compilador HLSL puede ser un poco más problemático acerca de sintaxis. Algunos ejemplos:

  • Usted debería inicializar completamente las variables output. Utilice la macro de ayuda UNITY_INITIALIZE_OUTPUT, tal como lo haría en D3D11.
  • los constructores “float3(a_4_component_value)” no funcionan. Utilice “a_4_component_value.xyz” más bien.

Las variables del shader “unity_Scale” han sido quitadas

La propiedad del shader “unity_Scale” ha sido quitada. En 4.x unity_Scale.w fue 1 / uniform Scale del transform, Unity 4.x solamente renderizaba modelos no-escalados o uniformemente escalados. Otras escalas fueron realizadas en CPU, lo cual fue muy costoso & tuvo una sobrecarga inesperada de memoria.

En Unity 5.0 todo esto es hecho en el GPU al simplemente pasar matrices con escalas no-uniformes a los shaders. Por lo tanto, unity_Scale ha sido quitado porque ya no representa la escala completa. En la mayoría de casos dónde “unity_Scale” era utilizado, nosotros recomendamos más bien transformarlo primero al espacio del mundo. En el caso de transformar normales, usted siempre tendrá que utilizar normalize en la normal transformada ahora. En algunos casos esto lleva a código un poco más caro en el vertex shader.

// Unity 4.x
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal * unity_Scale.w);
// Becomes this in Unity 5.0
float3 norm = normalize(mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal));
// Unity 4.x
temp.xyzw = v.vertex.xzxz * unity_Scale.xzxz * _WaveScale4 + _WaveOffset;
 
// Becomes this in Unity 5.0
float4 wpos = mul (_Object2World, v.vertex);
temp.xyzw = wpos.xzxz * _WaveScale4 + _WaveOffset;

Passes de Shadows, Depth Textures y ShadowCollector

Las sombras de los Forward rendered directional light no separan ya los pass “shadow collector”. Ahora estas calculan las sombras del screenspace de la depth texture (textura profunda) de la cámara ( como en deferred lighting).

Esto significa que los passes LightMode=ShadowCollector en los shaders (sombreadores) no so utilizados para nada; usted puede simplemente quitarlos de sus shaders.

En sí, la Depth texture no es generada utilizando el shader replacement (remplazo del shader) ya; ésta es renderizada con shader passes ShadowCaster. Esto significa que siempre y cuando sus objetos pueden emitir una sombras propias, entonces estas también van a aparecer en la depth texture de la cámara apropiadamente (antes era muy difícil hacer esto, si usted quería una custom vertex animation o funky alpha testing). Esto también significa que Camera-DepthTexture.shader ya no es utilizada para algo. Y también, todos los shadow shaders integrados utilizaban backface culling; esto fue cambiado para coincidir con el modo de culling de un renderizado regular.

Física en Unity 5.0
Otras notas de actualización para Unity 5.0