Unity3d ShaderLab之WorldNormalVector

时间:2021-06-22 22:13:54

  首先来看看Unity 3d官方文档上对WorldNormalVector的解释:

  • float3 worldNormal; INTERNAL_DATA - will contain world normal vector if surface shader writes to o.Normal. To get the normal vector based on per-pixel normal map, use WorldNormalVector (IN, o.Normal).

  float3 worldNormal; INTERNAL_DATA 是U3D提供的内置数据,如果表面shader为SurfaceOutput结构中的Normal赋值了,此它会包含 世界空间坐标系中法线的向量,通过调用方法 WorldNormalVector(IN,o.Normal) 即可得到此值。如果没有为Normal赋值,则直接调用IN.worldNormal即可得到此值。具体用法如:

struct Input
{
  float3 worldNormal;
  INTERNAL_DATA
}; void surf(Input IN, inout SurfaceOutput o)
{
  o.Normal = UnpackNormal(tex2D(_NormalMap, IN.NormalMap)).rgb;   float3 diffuseVal = texCUBE(_CubeMap, WorldNormalVector(IN, o.Normal)).rgb; }

  这个方法把法线从: 切空间-->模型空间-->世界空间。

  注意,o.Normal是在切空间中的向量,所谓切空间,即TBN空间,指对每一顶点,以U坐标增大的方向和tangent轴,以v坐标增大方向为bitangent轴,结合三角形面的法线,则构成TBN坐标系。

  关于切空间的详细知识,可访问:http://blog.csdn.net/bonchoix/article/details/8619624