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

Escribiendo Vertex y 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.

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

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

Otras directivas de compilación;

  • #pragma target name - qué shader target a compilar. Mire la página Shader Compilation Targets para detalles.
  • #pragma only_renderers space separated names - compile la función shader solamente para dados renderizados. Por defecto los shaders son compilados a todos los renderizados. Mire Renderers a continuación para más detalles.
  • #pragma exclude_renderers space separated names - no compile el shader para los dados renderizadores. Por defecto, los shaders son compilados a todos los renderizadores. Mire Renderers a continuación para más detalles.
  • #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 - genera varios shader hardware variants de cada shader compilado, para cada nivel de hardware que podría ejecutar el renderizador seleccionado. Mire Renderers para más detalles.

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.

Directivas de compilación que no hacen nada a partir de Unity 5.0 y pueden eliminarse con seguridad: #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