Unity 6.3
0 онлайн 26 гостей 3 в системе
Вход

Примеры использования Shader для отражения поверхности во встроенном Render Pipeline

Вот шейдер, который выполняет кубическое отражение с помощью встроенного входа worldRefl. Он очень похож на встроенный Reflective/Diffuse Shader:

  Shader "Example/WorldRefl" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _Cube ("Cubemap", CUBE) = "" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
          float3 worldRefl;
      };
      sampler2D _MainTex;
      samplerCUBE _Cube;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * 0.5;
          o.Emission = texCUBE (_Cube, IN.worldRefl).rgb;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

Поскольку он назначает цвет отражения как Выбросы, мы получаем очень блестящий солдат:

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

Если вы хотите выполнить отражения, которые зависят от нормальных отображений, то вам потребуется немного больше времени: INTERNAL_DATA необходимо добавить в структуру Input, а функцию WorldReflectionVector использовать для вычисления вектора отражения на пиксель после того, как вы написали выход Normal.

  Shader "Example/WorldRefl Normalmap" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
      _Cube ("Cubemap", CUBE) = "" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          float3 worldRefl;
          INTERNAL_DATA
      };
      sampler2D _MainTex;
      sampler2D _BumpMap;
      samplerCUBE _Cube;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * 0.5;
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
          o.Emission = texCUBE (_Cube, WorldReflectionVector (IN, o.Normal)).rgb;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

Вот нормальный блестящий солдат:

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