Version: 2020.2
Semánticas de Shader
Proporcionar datos del vértice a programas vertex

Accediendo propiedades shader en Cg/HLSL

El Sombreador declara propiedades del Material en un bloque Properties. Si usted quiere tener acceso a algunas de esas propiedades en un shader program, usted necesitará declarar una variable Cg/HLSL con el mismo nombre y tipo de correspondencia. Un ejemplo es dado en Shader Tutorial: Vertex and Fragment Programs.

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:

  • Las propiedades de color y vector se correlacionan con las variables float4, half4 o fixed4.
  • Las propiedades de rango y float se corresponden con las variables float, half o fixed.
  • Propiedades de Textura mapean a variables sampler2D para texturas (2D) regulares; Cubemaps mapean a samplerCUBE; y texturas 3D mapean a sampler3D.

Cómo los valores de propiedad se proporcionan a los shaders

Los valores de propiedad shader se encuentran y se proporciona a los shaders desde estos lugares:

  • Valores Per-Renderer configurados en MaterialPropertyBlock. Esto suele ser datos “por instancia” (por ejemplo, color de tinte personalizado para muchos objetos que comparten el mismo material).
  • Los Valores configurados en el Material que se utiliza en el objeto renderizado.
  • Propiedades globales shader, configuradas por el código de renderizado de Unity (mire las variables shader incorporadas), o de sus propios scripts (por ejemplo, Shader.SetGlobalTexture).

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).

Propiedades Serializadas y de Runtime de Material

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).

Propiedades especiales de Textura

Para cada textura que está configurada como una propiedad shader/material, Unity también configura alguna información extra en propiedades de vector adicionales.

Texture tiling & offset

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 tiling
  • y contiene un valor Y de tiling
  • z contiene un valor X de offset
  • w contiene un valor Y de offset

Por ejemplo, si un shader contiene una textura llamada _MainTex, la información tiling estará en el vector _MainTex_ST.

Tamaño de Textura

{TextureName}_TexelSize - una propiedad float4 contiene la información del tamaño de la textura:

  • x contiene 1.0/anchura
  • y contiene 1.0/altura
  • z contiene anchura
  • w contiene altura

Parámetros de Textura HDR

{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.

Espacios de color y datos shader de color/vector

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).

Véase también

Semánticas de Shader
Proporcionar datos del vértice a programas vertex