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

  • 相关阅读:
    sqlserver 智能提示插件
    支付相关-算法知识2
    支付相关-算法知识1
    支付相关-证书知识学习4
    支付相关-证书知识学习3
    支付相关-证书知识学习2
    getID3类的学习使用
    ThinkPHP 的 Vender的简单实用
    postman的简单使用
    js 实现点击复制文本内容
  • 原文地址:https://www.cnblogs.com/jietian331/p/4103653.html
Copyright © 2011-2022 走看看