Unity 6.3
0 онлайн 134 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 318 из 442

Настраиваемые данные Пример Shader поверхности во встроенном Render Pipeline

Используя функцию модификатора вершин, также можно вычислить пользовательские данные в вершинном шейдере, которые затем будут переданы функции Surface Shader на пиксель. Используется та же директива компиляции vertex:functionName, но функция должна принимать два параметра: inout appdata_full и out Input. Вы можете заполнить любой член Input, который не является встроенным значением.

Примечание: Пользовательские вводные члены, используемые таким образом, не должны иметь имена, начинающиеся с 'uv', иначе они не будут работать правильно.

В следующем примере определен пользовательский член float3 customColor, который вычисляется в вершинной функции:

  Shader "Example/Custom Vertex Data" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert vertex:vert
      struct Input {
          float2 uv_MainTex;
          float3 customColor;
      };
      void vert (inout appdata_full v, out Input o) {
          UNITY_INITIALIZE_OUTPUT(Input,o);
          o.customColor = abs(v.normal);
      }
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Albedo *= IN.customColor;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

В этом примере customColor устанавливается на абсолютное значение нормы:

Пример шейдера, который вычисляет значения в вертикальном шейдере и использует их в фрагментном шейдере.
Пример шейдера, который вычисляет значения в вертикальном шейдере и использует их в фрагментном шейдере.

Более практичным применением может быть вычисление любых данных по вершинам, которые не предоставляются встроенными переменными Input; или оптимизация вычислений Shader. Например, можно вычислить Rim lighting на вершинах GameObject, вместо того, чтобы делать это в Surface Shader по пикселям.