Surface Shaders con Teselación DX11 / OpenGL Core
Ejemplos del Vertex y Fragment Shader

Writing vertex and fragment shaders

Los shaders ShaderLab abarcan más que simplemente “shaders de hardware”. Ellos hacen muchas cosas. Ellos describen propiedades que son mostradas en el Inspector del Material, contiene múltiples implementaciones de shader para diferente hardware de gráficos, configura el estado de hardware de funciones fijas y así. Los shaders programables actuales - como los programas vertex y fragment - son simplemente una parte de todo el concepto “shader” del ShaderLab. Eche un vistazo al totorial shader para una introducción básica. Aquí nosotros llamaremos los shaders de baja gama de hardware shader programs.

Si usted quiere escribir sombreadores que interactuén con la iluminación, eche un vistazo a la documentación Surface Shaders. Para algunos ejemplos, eche un vistazo al Vertex y Fragment Shader Ejemplos. El resto de esta página va a asumir los shaders que no interactuán con las luces de Unity (e.g. efectos especiales, Image Effects etc.)

Los programas del shader están escritos en el lenguaje Cg/HLSL, al incorporar “snippets” en el texto shader, algún lado dentro del comando Pass. Ellos en verdad se ven así:

  Pass {
      // ... the usual pass state setup ...

      CGPROGRAM
      // compilation directives for this snippet, e.g.:
      #pragma vertex vert
      #pragma fragment frag

      // the Cg/HLSL code itself

      ENDCG
      // ... the rest of pass setup ...
  }

Cg/HLSL snippets

Los snippets del programa Cg/HLSL están escritos entre CGPROGRAM y ENDCG.

At the start of the snippet compilation directives can be given as #pragma statements. Directives indicating which shader functions to compile:

  • #pragma vertex name - compile function name as the vertex shader.
  • #pragma fragment name - compile function name as the fragment shader.
  • #pragma geometry name - compile function name as DX10 geometry shader. Having this option automatically turns on #pragma target 4.0, described below.
  • #pragma hull name - compile function name as DX11 hull shader. Having this option automatically turns on #pragma target 5.0, described below.
  • #pragma domain name - compile function name as DX11 domain shader. Having this option automatically turns on #pragma target 5.0, described below.

Other compilation directives:

  • #pragma target name - qué shader target a compilar. Mire la página Shader Compilation Targets para detalles.
  • #pragma only_renderers space separated names - compile shader only for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma exclude_renderers space separated names - do not compile shader for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma multi_compile … - para trabajar con varios shader variants.
  • #pragma enable_d3d11_debug_symbols - genera información de depuración para los shaders compilados para DirectX 11, esto le permite a usted depurar shaders vía el depurador de Gráficos Visual Studio 2012 (o la última versión).
  • #pragma hardware_tier_variants renderer name - generate multiple shader hardware variants of each compiled shader, for each hardware tier that could run the selected renderer. See Renderers below for details.

Each snippet must contain at least a vertex program and a fragment program. Thus #pragma vertex and #pragma fragment directives are required.

Compilation directives that don’t do anything starting with Unity 5.0 and can be safely removed: #pragma glsl, #pragma glsl_no_auto_normalization, #pragma profileoption, #pragma fragmentoption.

Plataformas de Renderizado

Unity soporta varios APIs de renderizado (e.g. Direct3D 9 y OpenGL),y por defecto todos los programas del shader son compilados para los renderizadores soportados. Usted puede indicar qué rennderizados quiere al compilar utilizando las directivas #pragma only_renderers o #pragma exclude_renderers. Esto es útil en los casos en que explícitamente utilice algunas características de lenguaje de shader que sabe que no son posibles en algunas plataformas. Los nombres de procesador actualmente admitidos son:

  • d3d9 - Direct3D 9.
  • d3d11 - Direct3D 11/12.
  • glcore - OpenGL 3.x/4.x.
  • gles - OpenGL ES 2.0.
  • gles3 - OpenGL ES 3.x.
  • metal - iOS/Mac Metal.
  • d3d11_9x - Nivel de características Direct3D 11 9.x, como comúnmente se utiliza en plataformas WSA.
  • xbox360 - Xbox 360.
  • xboxone - Xbox One.
  • ps4 - PlayStation 4.
  • psp2 - PlayStation Vita.
  • n3ds - Nintendo 3DS.
  • wiiu - Nintendo Wii U.

Por ejemplo, esta linea solo compilaría el sombreador a un modo D3D9:

#pragma only_renderers d3d9

Véase también

Surface Shaders con Teselación DX11 / OpenGL Core
Ejemplos del Vertex y Fragment Shader