UnityShader内置函数和一些CG函数

refract(I, N, eta)  根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。只对三元向量有效。

appdata_full

顶点着色器输入,包含位置、法线、切线、顶点颜色和两个纹理坐标。

2

3

4

5

6

7

8

9

10

11

struct appdata_full {

    float4 vertex : POSITION;

    float4 tangent : TANGENT;

    float3 normal : NORMAL;

    float4 texcoord : TEXCOORD0;

    float4 texcoord1 : TEXCOORD1;

    float4 texcoord2 : TEXCOORD2;

    float4 texcoord3 : TEXCOORD3;

    fixed4 color : COLOR;

    UNITY_VERTEX_INPUT_INSTANCE_ID

};

 appdata_base

顶点着色器输入,包含位置、法线和一个纹理坐标。

2

3

4

5

6

struct appdata_base {

    float4 vertex : POSITION;

    float3 normal : NORMAL;

    float4 texcoord : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID

};

 

appdata_tan

顶点着色器输入,包含位置、法线、切线和一个纹理坐标。

1

2

3

4

5

6

7

8

9

10

11

struct appdata_full {

    float4 vertex : POSITION;

    float4 tangent : TANGENT;

    float3 normal : NORMAL;

    float4 texcoord : TEXCOORD0;

    float4 texcoord1 : TEXCOORD1;

    float4 texcoord2 : TEXCOORD2;

    float4 texcoord3 : TEXCOORD3;

    fixed4 color : COLOR;

    UNITY_VERTEX_INPUT_INSTANCE_ID

};

float3 WorldSpaceViewDir(float4 v)

输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向

 

inline float3 WorldSpaceViewDir( in float4 localPos )

{

    float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;

    return UnityWorldSpaceViewDir(worldPos);

}

float3 UnityWorldSpaceViewDir(float4 v)

输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向

inline float3 UnityWorldSpaceViewDir( in float3 worldPos )

{

    return _WorldSpaceCameraPos.xyz - worldPos;

}

float3 ObjSpaceViewDir(float4 v)

输入一个模型空间中的顶点位置,返回模型空间中从该店到摄像机的观察方向

inline float3 ObjSpaceViewDir( in float4 v )

{

    float3 objSpaceCameraPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)).xyz;

    return objSpaceCameraPos - v.xyz;

}

光源方向

仅当使用前向渲染(ForwardBase 或 ForwardAdd 通道类型)时,这些函数才有用

float3 WorldSpaceLightDir(float4 v)

输入一个模型空间中的顶点位置,返回世界空间中从这个点到平行光源的方向

inline float3 WorldSpaceLightDir( in float4 localPos )

{

    float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;

    return UnityWorldSpaceLightDir(worldPos);

}

float3 UnityWorldSpaceLightDir(float3 v)

输入一个世界空间中的顶点位置,返回世界空间中从这个点到平行光源的方向

 

inline float3 UnityWorldSpaceLightDir( in float3 worldPos )

{

    #ifndef USING_LIGHT_MULTI_COMPILE

        return _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w;

    #else

        #ifndef USING_DIRECTIONAL_LIGHT

        return _WorldSpaceLightPos0.xyz - worldPos;

        #else

        return _WorldSpaceLightPos0.xyz;

        #endif

    #endif

}

float3 ObjSpaceLightDir(float4 v)

输入一个模型空间中的顶点位置,返回模型空间中从这个点到平行光源的方向

inline float3 ObjSpaceLightDir( in float4 v )

{

    float3 objSpaceLightPos = mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;

    #ifndef USING_LIGHT_MULTI_COMPILE

        return objSpaceLightPos.xyz - v.xyz * _WorldSpaceLightPos0.w;

    #else

        #ifndef USING_DIRECTIONAL_LIGHT

        return objSpaceLightPos.xyz - v.xyz;

        #else

        return objSpaceLightPos.xyz;

        #endif

    #endif

}

方向转换

float3 UnityObjectToWorldNormal(float3 norm)

把法线方向,从模型空间转为世界空间

inline float3 UnityObjectToWorldNormal( in float3 norm )

{

#ifdef UNITY_ASSUME_UNIFORM_SCALING

    return UnityObjectToWorldDir(norm);

#else

    // mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}

    return normalize(mul(norm, (float3x3)unity_WorldToObject));

#endif

}

float3 UnityObjectToWorldDir(float3 dir)

把方向从模型空间,转为世界空间

inline float3 UnityObjectToWorldDir( in float3 dir )

{

    return normalize(mul((float3x3)unity_ObjectToWorld, dir));

}

float3 UnityWorldToObjectDir(float3 dir)

把方向从世界空间,转为模型空间

inline float3 UnityWorldToObjectDir( in float3 dir )

{

    return normalize(mul((float3x3)unity_WorldToObject, dir));

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值