首先来看看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, useWorldNormalVector (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