Unity shader 眼球散射序列帧,随灯光转动

在这里插入图片描述
请添加图片描述
图片是从网上抠下来的质量有点低,思路是用模型右方向判断当前光源朝向

float Remap(half value, half4 remap) { 
    return remap.z + (value - remap.x) * (remap.w - remap.z) / (remap.y - remap.x); 
}
//unity自带方法,invert 默认float2(0,1)代表从图片左上角开始播放
void Flipbook(float2 UV, float Width, float Height, float Tile, float2 Invert, out float2 Out)
{
    Tile = floor(fmod(Tile + 0.000001, Width*Height));
    float2 tileCount = float2(1.0, 1.0) / float2(Width, Height);
    float tileX = (Tile - Width * floor(Tile * tileCount.x));
    float tileY = (Invert.y * Height - (floor(Tile * tileCount.x) + Invert.y * 1));
    Out = (UV + float2(tileX, tileY)) * tileCount;
}

half GetIrisSSS(float2 uv)
{
    float3 lightDir = _MainLightPosition.xyz;
    float3 front = unity_ObjectToWorld._12_22_32;
    float3 right = unity_ObjectToWorld._13_23_33;
    float FrontL = dot(front.xyz, lightDir.xyz);
    float RightL = dot(right.xz, lightDir.xz);

    half f = Remap(saturate(1 - abs(RightL)), half4(0,1,0,5));//0-1映射到0-5驱动图的6帧
    float fps = fmod(f, 6);
    int tile = floor(fps);
    uv = RightL < 0 ? uv : float2(1 - uv.x, uv.y);//左右翻转uv
    Flipbook(uv, 3, 2, tile, float2(0,1), uv);
    
    half s = SAMPLE_TEXTURE2D(_EnvMap, sampler_EnvMap, uv).a * saturate(FrontL);//过滤背部
   
    return s;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值