• TANGENT_SPACE_ROTATION的解释


    TANGENT_SPACE_ROTATION 宏 相当于嵌入如下两行代码:

      float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;

      float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );

    也就是构造出  tangent  space 的坐标系, 定义转换world space的向量到tangent space的rotation 矩阵。

    TANGENT_SPACE_ROTATION这行代码之后,就可以用rotation这个代表从世界坐标到切线空间的矩阵了。不过要记得TANGENT_SPACE_ROTATION后面要加分号“;”的,比如:

    struct v2f {
       float4 pos:SV_POSITION;
       float2 uv:TEXCOORD0;
       float3 lightDir:TEXCOORD1;
      };

      v2f vert (appdata_full v) {
       v2f o;
       o.pos=UnityObjectToClipPos(v.vertex);
       o.uv=v.texcoord.xy;
       TANGENT_SPACE_ROTATION;
       o.lightDir= mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;//Direction Light
       o.lightDir=mul(rotation,o.lightDir);
       return o;
      }
      float4 frag(v2f i):COLOR
      {
       float3 N=UnpackNormal(tex2D(_BumpMap,i.uv));
       float diff=max(0,dot(N,i.lightDir));
       float4 c=_LightColor0*diff;
       return c*2;
      }

  • 相关阅读:
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    YQCB冲刺第二周第二天
    YQCB冲刺第二周第一天
  • 原文地址:https://www.cnblogs.com/laoyueblogs/p/13782797.html
Copyright © 2020-2023  润新知