Version: 6000.3
语言: 中文
内置渲染管线中的法线贴图表面着色器示例
顶点修改器内置渲染管线中的表面着色器示例

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

这是一个着色器在 GPU 上运行的程序。更多信息
请参阅术语表
使用内置的worldRefl输入。它与内置的反射/漫反射着色器非常相似:

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

因为它将反射颜色指定为发射,所以我们得到了一个非常闪亮的士兵:

使用世界反射纹理作为发射纹理的表面着色器示例。
使用世界反射纹理作为发射纹理的表面着色器示例。

如果要进行受以下影响的反射法线贴图(normal maps一种凹凸贴图纹理,允许您向模型添加表面细节,例如凹凸、凹槽和划痕,这些细节可以捕捉光线,就好像它们由真实几何体表示一样。
请参阅术语表
,它需要稍微多一些参与: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"
  }

这是一个法线映射的闪亮士兵:

表面着色器示例,该示例使用世界反射纹理作为发射纹理,并对其应用法线纹理。
表面着色器示例,该示例使用世界反射纹理作为发射纹理,并对其应用法线纹理。
内置渲染管线中的法线贴图表面着色器示例
顶点修改器内置渲染管线中的表面着色器示例