Shader declares Material properties in a Properties block. If you want to access some of those properties in a shader program, you need to declare a Cg/HLSL variable with the same name and a matching type.
Por ejemplo estas propiedades del sombreador:
_MyColor ("Some Color", Color) = (1,1,1,1)
_MyVector ("Some Vector", Vector) = (0,0,0,0)
_MyFloat ("My float", Float) = 0.5
_MyTexture ("Texture", 2D) = "white" {}
_MyCubemap ("Cubemap", CUBE) = "" {}
serían declaradas para acceso en código Cg/HLSL como:
fixed4 _MyColor; // low precision type is usually enough for colors
float4 _MyVector;
float _MyFloat;
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
Cg/HLSL también puede aceptar la palabra clave uniform, pero no es necesario:
uniform float4 _MyColor;
Tipos de propiedades en ShaderLab mapean a tipos de variable de Cg/HLSL de esta forma:
Los valores de propiedad shader se encuentran y se proporciona a los shaders desde estos lugares:
El orden de precedencia es como anteriormente: los datos por instancia sobrepasan todo; Entonces se usan los datos materiales; Y finalmente si la propiedad shader no existe en estos dos lugares entonces se utiliza el valor de la propiedad global. Por último, si no hay ningún valor de propiedad shader definida en ninguna parte, se proporcionará el valor “predeterminado” (cero para floats, negro para colores, textura blanca vacía para texturas).
Los Materials pueden contener ambos valores de propiedad serializados o configurados-en tiempo de ejecución.
Los datos serializados son todas las propiedades definidas en el bloque Properties del shader. Normalmente, estos son valores que necesitan ser almacenados en el material, y que son modificables por el usuario en material Inspector.
Un material también puede tener algunas propiedades que son utilizadas por el shader, pero no declaradas en el bloque Properties del shader. Normalmente esto es para propiedades que se configuran desde el código script en tiempo de ejecución, eg. A través de Material.SetColor. Tenga en cuenta que las matrices y arreglos sólo pueden existir como propiedades de tiempo de ejecución no serializadas (ya que no hay manera de definirlas en el bloque de propiedades).
Para cada textura que está configurada como una propiedad shader/material, Unity también configura alguna información extra en propiedades de vector adicionales.
Los Materiales a menudo tienen campos de tiling y offset (desplazamiento) para sus propiedades de textura. Esta información se pasa a shaders en una propiedad float4 {TextureName}_ST
:
x
contiene un valor X de tilingy
contiene un valor Y de tilingz
contiene un valor X de offsetw
contiene un valor Y de offsetPor ejemplo, si un shader contiene una textura llamada _MainTex
, la información tiling estará en el vector _MainTex_ST
.
{TextureName}_TexelSize
- una propiedad float4 contiene la información del tamaño de la textura:
x
contiene 1.0/anchuray
contiene 1.0/alturaz
contiene anchuraw
contiene altura{TextureName}_HDR
- Una propiedad float4 con información sobre cómo decodificar una textura potencialmente HDR (por ejemplo RGBM-codificada) dependiendo del espacio de color utilizado. Mire la función DecodeHDR
en el archivo include shader UnityCG.cginc.
Cuando se utiliza un color de espacio lineal,, todas las propiedades de color del material se suministran como colores sRGB, pero se convierten en valores lineales cuando se pasan a shaders.
Por ejemplo, si sus Properties del bloque de shader contiene una propiedad Color
denominada “MyColor“, la variable HLSL correspondiente de ”MyColor” obtendrá el valor de color lineal.
Para las propiedades que están marcadas como tipo Float
oVector
, no se realizan conversiones de espacio de color de forma predeterminada; Se supone que contienen datos que no son de color. Es posible añadir el atributo [Gamma]
para las propiedades float/vector para indicar que se especifican en el espacio sRGB, al igual que los colores (mirar Propiedades).