版本:Unity 6 (6000.0)
语言:英语
内置渲染管线中的法线贴图表面着色器示例
内置渲染管线中的顶点修改器表面着色器示例

内置渲染管线中的反射表面着色器示例

这是一个使用内置 worldRefl 输入进行立方体贴图反射的着色器在 GPU 上运行的程序。 更多信息
参见词汇表
。它与内置的反射/漫射着色器非常相似

  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 函数需要在编写法线输出后用于计算每个像素的反射向量。

  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"
  }

这是一个带有法线贴图的闪亮士兵

内置渲染管线中的法线贴图表面着色器示例
内置渲染管线中的顶点修改器表面着色器示例