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.
If you want to write shaders that interact with lighting, take a look at Surface Shaders documentation. For some examples, take a look at Vertex and Fragment Shader Examples. The rest of this page assumes shaders do not interact with Unity lights (for example special effects, post-processed effects etc.)
Shader programs are written in HLSL language, by embedding “snippets” in the shader text, somewhere inside the Pass command. They usually look like this:
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 ...
}
Los fragmentos del programa HLSL se escriben entre las palabras clave CGPROGRAM y ENDCG, o alternativamente entre HLSLPROGRAM y ENDHLSL. La última forma no incluye automáticamente HLSLSupport y UnityShaderVariables archivos de cabecera incorporados.
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:
Otras directivas de compilació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.
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
.
Unity supports several rendering APIs (e.g. Direct3D 11 and OpenGL), and by default all shader programs are compiled into all supported renderers. You can indicate which renderers to compile to using #pragma only_renderers or #pragma exclude_renderers directives. This is mostly useful in cases where you are explicitly using some shader language features that you know aren’t possible on some platforms. Supported renderer names are:
For example, this line would only compile shader into D3D11 mode:
#pragma only_renderers d3d11