zoukankan      html  css  js  c++  java
  • Unity3d ShaderLab之WorldNormalVector

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

  • 相关阅读:
    SQL进阶系列之2自连接
    SQL进阶系列之0窗口函数
    SQL进阶系列之1CASE表达式
    Python for Email
    数据分析的统计基础5
    利用Python openpyxl操作Excel
    SQL基础篇(MICK)
    数据分析的统计基础4
    数据分析的统计基础3
    数据分析的统计基础2
  • 原文地址:https://www.cnblogs.com/jietian331/p/4103653.html
Copyright © 2011-2022 走看看