Surface Shaders con Teselación DX11
Ejemplos de Vertex y Fragment Shader

Escribiendo Vertex y fragment shaders

Los sombreadores ShaderLab abarcan más que simplemente “hardware shaders”. Ellos hacen muchas cosas. Ellos describen propiedades que son mostradas en el Inspector del Material, contiene múltiples implementaciones de sombreador para diferente hardware de gráficas, configura el estado de hardware de funciones fijas y así. Los sombreadores programables actuales - como los programas vertex y fragment - son simplemente una parte de todo el concepto “sombreador” del ShaderLab. Eche un vistazo a shader tutorial para una introducción básica. Aquí nosotros llamaremos los sombreadores 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 a Vertex and Fragment Shader Examples. El resto de esta página va a asumir los sombreadores que no interactuán con las luces de Unity (e.g. efectos especiales, Image Effects etc.)

Los programas del Sombreador están escritos en el lenguaje Cg / HLSL, al incorporar “snippets” en el texto del sombreador, 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 están escritos entre CGPROGRAM y ENDCG.

Al comienzo de las directivas de compilación snippet pueden ser dadas como declaraciones #pragma. Las directivas indican qué funciones del sombreador van a ser compiladas:

  • #pragma vertex name - la función de compilación name como el vertex shader.
  • #pragma fragment name - la función de compilación name como el fragment shader.
  • #pragma geometry name - función de compilación name como el DX10 geometry shader. Tener esta opción automáticamente prende el #pragma target 4.0, descrito a continuación.
  • #pragma hull name - la función de compilación name como el DX11 hull shader. Tener esta opción automáticamente prende el #pragma target 5.0, descrito a continuación.
  • #pragma domain name - la función de compilación name como DX11 domain shader. Tener esta opción automáticamente prende el #pragma target 5.0, descrito a continuación.

Otras directivas de compilación;

  • #pragma target name - qué shader target a compilar. Vea Shader targets a continuación para más detalles.
  • #pragma only_renderers space separated names - compile shader only para dados renderizados. Por defecto los sombreadores son compilados a todos los renderizados. Vea Renderers a continuación para más detalles.
  • #pragma exclude_renderers space separated names - no compile el sombreador para los dados renderizadores. Por defecto, los sombreadores son compilados a todos los renderizadores. Vea Renderers a continuación para más detalles.
  • #pragma multi_compile …_ - para trabajar con multiple shader variants.
  • #pragma enable_d3d11_debug_symbols - genera información de depuración para los sombreadores compilados para DirectX 11, esto le permite a usted depurar sombreadores vía el depurador de Gráficas Visual Studio 2012 (o la última versión).

Cada snippet debe contener al menos un programa vertex y un programa fragment. Por lo tanto, las directivas #pragma vertex y #pragma fragment son requeridas.

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 sombreador 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 si usted sabe que solo va a tener como objetivo a Mac OS X(dónde no hay Direct3D), o solamente Windows (dónde Unity por determinado se va a D3D), o si algún sombreador en particular es solamente posible en un renderizado y no en otros. Actualmente los nombres de los renderizados soportados son:

  • d3d9 - Direct3D 9.
  • d3d11 - Direct3D 11/12.
  • #pragma target 3.0 - compila a shader model 3.0:
  • gles - OpenGL ES 2.0.
  • gles3 - OpenGL ES 3.x.
  • metal - iOS/Mac Metal.
  • d3d11_9x - Direct3D 11 9.x feature level, comúnmente utilizado en plataformas WSA/WP8.
  • xbox360 - Xbox 360.
  • xboxone - Xbox One.
  • ps3 - PlayStation 3.
  • ps4 - PlayStation 4.
  • #pragma target 3.0 - compila a shader model 3.0:
  • 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
Ejemplos de Vertex y Fragment Shader