El Sombreador integrado incluye archivos
Funciones Shader integradas de ayuda

Macros del preprocesador Shader predefinidas

Unity define varias macros preprocessor cuando se compile programas Shader.

Plataforma destino

Macro: Target platform:
SHADER_API_D3D9 Direct3D 9
SHADER_API_D3D11 Direct3D 11
SHADER_API_GLCORE Desktop OpenGL “core” (GL 3/4)
SHADER_API_OPENGL Legacy desktop OpenGL (GL 2)
SHADER_API_GLES OpenGL ES 2.0
SHADER_API_GLES3 OpenGL ES 3.0/3.1
SHADER_API_METAL iOS/Mac Metal
SHADER_API_D3D11_9X Objetivo Direct3D 11 “nivel de características 9.x” para Windows Store y Windows Phone
SHADER_API_PSSL PlayStation 4
SHADER_API_XBOXONE Xbox One
SHADER_API_PSP2 PlayStation Vita
SHADER_API_WIIU Nintendo Wii U

SHADER_API_MOBILE se define en todas las plataformas móviles (GLES, GLES3, METAL, PSP2).

Adicionalmente, SHADER_TARGET_GLSL se define cuando el lenguaje de shading destino es GLSL (siempre true para plataformas OpenGL/GLES).

Modelo destino shader

SHADER_TARGET se define con un valor numérico que coincida con el modelo de compilación de destino Shader (es decir, que coincida con la directiva #pragma target). Por ejemplo, SHADER_TARGET es30 al compilar en Shader modelo 3.0. Puede usarlo en el código Shader para realizar comprobaciones condicionales. Por ejemplo:

#if SHADER_TARGET < 30
    // less than Shader model 3.0:
    // very limited Shader capabilities, do some approximation
#else
    // decent capabilities, do a better thing
#endif

Versión de Unity

UNITY_VERSION contiene el valor numérico de la versión de Unity. Por ejemplo, UNITY_VERSION es 501 para Unity 5.0.1. Esto se puede utilizar para comparaciones de versiones si necesita escribir Shaders que utilicen la funcionalidad integrada de Shader. Por ejemplo, una comprobación #if UNITY_VERSION >= 500 preprocessor sólo pasa en versiones 5.0.0 o posterior.

Ayudas de diferencia de plataforma

El uso directo de estas macros de plataforma se desaconseja, ya que no siempre contribuyen a la futura prueba de su código. Por ejemplo, si está escribiendo un Shader que comprueba D3D9, es posible que desee asegurarse de que, en el futuro, la comprobación se amplíe para incluir D3D11. En su lugar, Unity define varias macros de ayuda (en HLSLSupport.cginc):

Macro: Use:
UNITY_BRANCH Agregue esto antes de declaraciones condicionales para decirle al compilador que esto debe ser compilado en una rama real. Se expande a [branch] cuando está en plataformas HLSL.
UNITY_FLATTEN Agregue esto antes de declaraciones condicionales para decirle al compilador que debe ser aplastado para evitar una instrucción de rama real. Se expande a [flatten] cuando está en plataformas HLSL.
UNITY_NO_SCREENSPACE_SHADOWS Se define en plataformas que no usan shadowmaps de pantalla en cascada (plataformas móviles).
UNITY_NO_LINEAR_COLORSPACE Se define en plataformas que no admiten espacio de color lineal (plataformas móviles).
UNITY_NO_RGBM Se define en plataformas donde no se utiliza la compresión RGBM para lightmaps (plataformas móviles).
UNITY_NO_DXT5nm Se define en plataformas que no utilizan compresión de mapas normales DXT5nm (plataformas móviles).
UNITY_FRAMEBUFFER_FETCH_AVAILABLE Definido en plataformas donde la funcionalidad “framebuffer color fetch” puede estar disponible (generalmente plataformas iOS - OpenGL ES 2.0, 3.0 y Metal).
UNITY_USE_RGBA_FOR_POINT_SHADOWS Definido en plataformas donde los shadowmaps de luz puntual utilizan RGBA Texturas con profundidad codificada (otras plataformas utilizan texturas de punto flotante de un solo canal).
UNITY_ATTEN_CHANNEL Define qué canal de atenuación de la luz Texture contiene los datos; Utilizado en código de iluminación por píxel. Se define como ‘r’ o ‘a’.
UNITY_HALF_TEXEL_OFFSET Se define en plataformas que necesitan un ajuste de offset de medio texel en mapear texels a píxeles (por ejemplo, Direct3D 9).
UNITY_UV_STARTS_AT_TOP Siempre definido con valor de 1 o 0. Un valor de 1 está en plataformas donde la coordenada de textura V es 0 en la “parte superior” de la textura. Las plataformas similares a Direct3D utilizan un valor de 1; Las plataformas similares a OpenGL utilizan el valor 0.
UNITY_MIGHT_NOT_HAVE_DEPTH_Texture Se define si una plataforma puede emular mapas de sombra o texturas de profundidad mediante la renderización manual de profundidad en una textura.
UNITY_PROJ_COORD(a) Dado un vector de 4 componentes, esto devuelve una coordenada de textura adecuada para las lecturas de textura proyectadas. En la mayoría de las plataformas esto devuelve el valor dado directamente.
UNITY_NEAR_CLIP_VALUE Definido al valor del plano de recorte cercano. Las plataformas similares a Direct3D usan 0.0 mientras que las plataformas similares a OpenGL utilizan –1.0.
UNITY_VPOS_TYPE Define el tipo de dato requerido para la entrada de posición de píxeles (VPOS): float2 en D3D9,float4 en otro lugar.
UNITY_CAN_COMPILE_TESSELLATION Definido cuando el compilador de Shader “entiende” la sintaxis de Shader HLSL de tessellation (actualmente sólo D3D11).
UNITY_INITIALIZE_OUTPUT(type,name) Inicialización el nombre de la variable name del type dado a cero.
UNITY_COMPILER_HLSL, UNITY_COMPILER_HLSL2GLSL, UNITY_COMPILER_CG Indica qué compilador Shader se está utilizando para compilar Shaders - respectivamente: HLSL de Microsoft, traductor HLSL a GLSL y Cg de NVIDIA. Consulte la documentación de Shading Languages para obtener más detalles. Utilice esto si se ejecuta en la sintaxis Shader muy específica manipulación de las diferencias entre los compiladores, y desea escribir código diferente para cada compilador.
  • UNITY_REVERSED_Z - defined on plaftorms using reverse Z buffer. Stored Z values are in the range 1..0 instead of 0..1.

Macros de shadow mapping

La declaración y el muestreo de mapas de sombra pueden ser muy diferentes dependiendo de la plataforma. Unity tiene varios macros para ayudar con esto:

Macro: Use:
UNITY_DECLARE_SHADOWMAP(tex) Declara una variable de textura de shadowmap con el nombre “tex”.
UNITY_SAMPLE_SHADOW(tex,uv) Muestra un shadowmap Textura “tex” en la coordenada “uv” dada (los componentes XY son de ubicación de textura, componente Z es la profundidad a comparar con). Devuelve el valor de un solo float con el término sombra en el rango 0..1.
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) Similar al anterior, pero se lee un mapa de sombra proyectivo. “Uv” es un float4, todos los demás componentes están divididos por .w para realizar la búsqueda.

NOTE: Not all graphics cards support shadowmaps. Use SystemInfo.SupportsRenderTextureFormat to check for support.

Macros buffer constantes

Direct3D 11 agrupa todas las variables Shader en “buffers constantes”. La mayoría de las variables incorporadas de Unity ya están agrupadas, pero para las variables en sus propios Shaders podría ser más óptimo ponerlas en buffers constantes independientes dependiendo de la frecuencia esperada de actualizaciones.

Utilice las macros CBUFFER_START(name) y CBUFFER_END para esto:

CBUFFER_START(MyRarelyUpdatedVariables)
    float4 _SomeGlobalValue;
CBUFFER_END

Declaración de macros Texture/Sampler

Por lo general, se utiliza texture2D en código Shader para declarar un par de texturas y muestras. Sin embargo, en algunas plataformas (como DX11), Textures y Samplers son GameObjects separados, y el número máximo posible de muestreadores es bastante limitado. Unity tiene algunas macros para declarar Textures sin Samplers, y para muestrear una Texture utilizando un Sampler de otra Texture. Utilice esto si termina terminando en los límites de Sampler, y usted sabe que varias de sus Texturas pueden de hecho compartir un Sampler (Los Samplers definen el filtro de Texturas y modo de wrapping (envoltura)).

Macro: Use:
UNITY_DECLARE_TEX2D(name) Declara una Textura y un par Sampler.
UNITY_DECLARE_TEX2D_NOSAMPLER(name) Declara una Textura sin un Sampler.
UNITY_DECLARE_TEX2DARRAY(name) Declara una variable Sampler de un arreglo de Textura
UNITY_SAMPLE_TEX2D(name,uv) Muestra de un par de textura y Sampler, usando la coordenada de textura dada.
UNITY_SAMPLE_TEX2D_SAMPLER( name,samplername,uv) Muestra de Textura (name), utilizando un Sampler de otra Textura (samplername).
UNITY_SAMPLE_TEX2DARRAY(name,uv) Muestra de una matriz de textura con un float3 UV; El componente z de la coordenada es el índice del elemento de la matriz.
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) Muestra de una matriz de textura con un nivel mipmap explícito.

Indicadores Surface Shader pass

Cuando se compilan Surface Shaders,se generan una gran cantidad de código para varios pases para hacer la iluminación. Al compilar cada pase, se define una de las macros siguientes:

Macro: Use:
UNITY_PASS_FORWARDBASE Forward rendering base pass (directional light principal, lightmaps, SH).
UNITY_PASS_FORWARDADD Forward rendering pass aditivo (una luz por pass).
UNITY_PASS_DEFERRED Deferred shading pass (renderiza g buffer).
UNITY_PASS_SHADOWCASTER Shadow caster y depth Texture rendering pass.
UNITY_PASS_PREPASSBASE Legacy deferred lighting base pass (renderiza normales and exponente especular).
UNITY_PASS_PREPASSFINAL Legacy deferred lighting pass final (aplica iluminación y Texturas).

Mirar también

El Sombreador integrado incluye archivos
Funciones Shader integradas de ayuda