Unity define varias macros preprocessor cuando se compile programas Shader.
Macro: | Target platform: |
---|---|
SHADER_API_D3D11 |
Direct3D 11 |
SHADER_API_GLCORE |
Desktop OpenGL “core” (GL 3/4) |
SHADER_API_GLES |
OpenGL ES 2.0 |
SHADER_API_GLES3 |
OpenGL ES 3.0/3.1 |
SHADER_API_METAL |
iOS/Mac Metal |
SHADER_API_VULKAN |
Vulkan |
SHADER_API_D3D11_9X |
Direct3D 11 “feature level 9.x” target for Universal Windows Platform |
SHADER_API_PS4 |
PlayStation 4. SHADER_API_PSSL is also defined. |
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).
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
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.
Preprocessor macros SHADER_STAGE_VERTEX
, SHADER_STAGE_FRAGMENT
, SHADER_STAGE_DOMAIN
, SHADER_STAGE_HULL
, SHADER_STAGE_GEOMETRY
, SHADER_STAGE_COMPUTE
are defined when compiling each Shader stage. Typically they are useful when sharing Shader code between pixel Shaders and compute Shaders, to handle cases where some things have to be done slightly differently.
Direct use of these platform macros is discouraged, as they don’t always contribute to the future-proofing of your code. For example, if you’re writing a Shader that checks for D3D11, you may want to ensure that, in the future, the check is extended to include Vulkan. Instead, Unity defines several helper macros (in 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.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.
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
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. |
For more information, see documentation on Sampler States.
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). |
UNITY_SHADER_NO_UPGRADE
allows you to disable Unity from automatically upgrading or modifying your shader file.
• 2017–05–16 Page amended with no editorial review