Version: 2019.3
Consejos de rendimiento al escribir shaders
Custom Shader GUI (GUI Shader Personalizado)

Rendering con Shaders Remplazados

Algunos efectos de renderización requieren que se muestre una escena con un conjunto diferente de shaders. Por ejemplo, una buena detección de borde necesitaría una textura con escenas normales, por lo que podría detectar bordes donde las orientaciones de superficie difieren. Otros efectos pueden necesitar una textura con profundidad de escena, y así sucesivamente. Para lograr esto, es posible renderizar la escena con shaders reemplazados de todos los objetos.

El reemplazo Shader se realiza desde scripts usando las funciones Camera.RenderWithShader or Camera.SetReplacementShader. Ambas funciones toman un shader y un replacementTag.

Funciona así: la cámara renderiza la escena como normalmente lo hace. Los objetos todavía utilizan sus materiales, pero el shader real que termina siendo utilizado se cambia:

  • Si replacementTag está vacío, entonces todos los objetos de la escena se renderizan con el shader de reemplazo dado.
  • Si replacementTag no está vacío, entonces para cada objeto que sería renderizado:
    • Se consulta el shader del objeto real para el valor de etiqueta.
    • Si no tiene esa etiqueta, el objeto no se renderiza.
    • Un subshader se encuentra en el shader de reemplazo que tiene una etiqueta dada con el valor encontrado. Si no se encuentra este subshader, el objeto no se renderiza.
    • Ahora que el subshader se utiliza para renderizar el objeto.

Por lo que si todos los shaders tuvieran, por ejemplo, una etiqueta “RenderType” con valores como “Opaque”, “Transparent”, “Background”, “Overlay”, podría escribir un shader de reemplazo que solo renderiza objetos sólidos usando un subshader con RenderType = Solid tag. Los otros tipos de etiqueta no se encontrarían en el shader de reemplazo, por lo que los objetos no se renderizarían. O puede escribir varios subshaders para diferentes valores de etiqueta “RenderType”. Por cierto, todos los shaders integrados de Unity tienen un conjunto de etiquetas “RenderType”.

Remplazo del Lit shader

Cuando se utiliza el shader de reemplazo, la escena se procesa utilizando la ruta de procesamiento que se configura en la cámara. Esto significa que el shader utilizado para el reemplazo puede contener pases de sombra e iluminación (puede usar shaders de superficie para sustituir shaders). Esto puede ser útil para la renderización de efectos especiales y depuración de escenas.

Etiquetas de remplazo shader integradas en los shaders de Unity

Todos los shaders integrados de Unity tienen un conjunto de etiquetas “RenderType” que se pueden utilizar al renderizar con shaders de reemplazo. Los valores de etiqueta son los siguientes:

  • Opaque: la mayoría de shaders (Normal, Self Illuminated, Reflective, shaders de terreno).
  • Transparent: la mayoría de shaders semi-transparentes (Transparent, Particle, Font, terrain additive pass shaders).
  • TransparentCutout: masked shaders de transparencia (Transparent Cutout, dos shaders de pase de vegetación).
  • Background: Shaders Skybox.
  • Overlay: Shaders GUITexture, Halo, Flare.
  • TreeOpaque: Corteza del árbol del motor de terreno.
  • TreeTransparentCutout: hojas de los árboles del motor de terreno.
  • TreeBillboard: Árboles de cartelera del motor de terreno.
  • Grass: motor de terreno del pasto.
  • GrassBillboard: pasto de cartelera del motor de terreno.

Textura de profundidad/normales integrada a la escena

Una cámara tiene una capacidad incorporada para renderizar la profundidad o profundidad + textura normal, si necesita eso en algunos de sus efectos. Consulte la página Textura de la profundidad de la cámara. Tenga en cuenta que en algunos casos (dependiendo del hardware), las texturas de profundidad y profundidad + normales se pueden renderizar internamente usando shader de reemplazo. Por lo tanto, es importante tener la etiqueta correcta “RenderType” en sus shaders.

Código Ejemplo

Su función Start() especifica los shaders de remplazo:

void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

Esto solicita que EffectShader utilice la clave RenderType. El EffectShader tendrá etiquetas de valor clave para cada RenderType que desee. El Shader se verá así:

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

SetReplacementShader mirará a través de todos los objetos de la escena y, en lugar de utilizar su shader normal, utilice el primer subshader que tenga un valor coincidente para la clave especificada. En este ejemplo, cualquier objeto cuyo shader tenga Rendertype = “Opaque” tag será reemplazado por el primer subshader en EffectShader, cualquier objeto con RenderType = “SomethingElse” shader usará subshader de reemplazo de segunda y así uno. Los objetos cuyo shader no tiene un valor de etiqueta coincidente para la clave especificada en el shader de reemplazo no se procesarán.

Consejos de rendimiento al escribir shaders
Custom Shader GUI (GUI Shader Personalizado)