Cuantos más cálculos y procesamientos tenga que hacer su código shader, más impactará el rendimiento de su juego. Por ejemplo, soportar el color por material es bueno para hacer un shader más flexible, pero si siempre deja ese conjunto de colores en blanco, entonces los cálculos inútiles se realizan para cada vértice o píxel renderizado en la pantalla.
La frecuencia de los cálculos también afectará el rendimiento de su juego. Por lo general, hay muchos más píxeles renderizados (y, posteriormente, más ejecuciones píxel shader) que vértices (ejecuciones vertex shader) y más vértices que los objetos que se renderizan. Donde sea posible, mueva los cálculos fuera del código shader de píxeles en el código del shader de vértices, o muévalos completamente de los shaders y configure los valores en un script.
Los Surface Shaders son ideales para escribir shaders que interactúan con la iluminación. Sin embargo, sus opciones predeterminadas están ajustadas para cubrir un amplio número de casos generales. Ajústelos para situaciones específicas para que los shaders corran más rápido o al menos sean más pequeños:
approxview
para los shaders que utilizan la dirección de la vista (es decir, Specular) hace que la dirección de la vista sea normalizada por vértice en lugar de por píxel. Esto es aproximado, pero a menudo bastante bueno.halfasview
para los tipos de shader especulares es aún más rápida. El medio vector (a medio camino entre la dirección de iluminación y el vector de vista) se calcula y normaliza por vértice, y la función de iluminación recibe el medio vector como parámetro en lugar del vector de vista.noforwardadd
Hace que un shader admita totalmente la luz unidireccional en Forward rendering solamente. El resto de las luces pueden tener un efecto como luces por vértice o armónicos esféricos. Esto es genial para hacer su shader más pequeño y asegúrese de que siempre se hace en un solo paso, incluso con varias luces presentes.noambient
Desactiva la iluminación ambiental y las luces armónicas esféricas en un shader. Esto puede hacer que el rendimiento sea ligeramente más rápido.Cuando se escriben shaders en Cg/HLSL, hay tres tipos de números básicos: float
,half
y fixed
(mire Tipos de datos y precisión).
Para obtener un buen rendimiento, utilice siempre la precisión más baja posible. Esto es especialmente importante en plataformas móviles como iOS y Android. Las buenas reglas de juego son:
float
.half
de precisión. Aumente sólo si es necesario.fixed
.En la práctica, exactamente qué tipo de número utilizar depende de la plataforma y la GPU. Generalmente hablando:
float/half/fixed
terminará siendo exactamente el mismo debajo. Esto puede dificultar las pruebas, ya que es más difícil ver si la precisión media/fija es realmente suficiente, así que pruebe siempre sus sombreadores en el dispositivo de destino para obtener resultados precisos.Fixed
generalmente sólo es útil para las GPU móviles más antiguas. La mayoría de las GPU modernas (las que pueden ejecutar OpenGL ES 3 o Metal) tratan internamente la precisión fixed
y half
exactamente igual.Mire Tipos de Datos y Precisión para más detalles.
La función fija AlphaTest - o su equivalente programable, clip()
- tiene diferentes características de rendimiento en diferentes plataformas:
En algunas plataformas (en su mayoría GPUs móviles que se encuentran en dispositivos iOS y Android), utilizar ColorMask para dejar fuera algunos canales (por ejemplo, “ColorMask RGB”) puede ser intensivo para los recursos.