【Shaderlab练习】T_VertexScaleBase & T_VertexScaleTangent 控制顶点缩放

T_VertexScaleBase & T_VertexScaleTangent 控制顶点缩放

Github

https://github.com/l2xin/ZT_ShaderLearning/tree/master/Assets/L2xin/003_VertexScale


顶点基础缩放T_VertexScaleBase

效果gif

在这里插入图片描述

相当于模型整体缩放_MaxScale;

v.vertex.xyz *= (_SinTime.w + 2) * 0.5 * _MaxScale;


顶点沿切线方向缩放 T_VertexScaleTangent

效果gif

在这里插入图片描述

足球为例,由多个六边形组成,各六边形沿该平面切线方向缩放。
  • a ⃗ \vec{a} a 为物体中心到顶点向量,即输入的v.vertex(ObjectSpace物体坐标系);
  • b ⃗ \vec{b} b 为顶点法线,即输入的v.normal(ObjectSpace物体坐标系);
两个辅助函数
  • P r o j b a = b ⃗ ∗ a ⃗ ⋅ b ⃗ b ⃗ ⋅ b ⃗ Proj_b^a=\vec{b} * \frac{\vec{a} \cdot \vec{b}} { \vec{b} \cdot \vec{b}} Projba=b b b a b
  • R e j e c t b a = a ⃗ − P r o j b a Reject_b^a = \vec{a} - Proj_b^a Rejectba=a Projba
//计算a在b上的投影
float3 Proj(float3 a, float3 b)
{
    return (dot(a, b)/ dot(b,b)) * b;
}
//计算切线方向
float3 Reject(float3 a, float3 b)
{
    return a - Proj(a, b);
}
Shader中顶点操作如下(两种实现一样):
float3 vertex = Proj(v.vertex, v.normal) + Reject(v.vertex, v.normal) * (_SinTime.w + 1) * 0.5;
float3 vertex = v.vertex - Reject(v.vertex, v.normal) * (_SinTime.w + 1) * 0.5;

公式推导

a ⃗ 在 b ⃗ 上 的 投 影 \vec{a}在\vec{b}上的投影 a b 推导过程如下:

P r o j b a = b ⃗ ∣ b ⃗ ∣ ∗ ( ∣ a ⃗ ∣ ∗ c o s ( θ ) ) = b ⃗ ∗ ( a ⃗ ⋅ b ⃗ ) ∣ b ⃗ ∣ ⋅ ∣ b ⃗ ∣ = b ⃗ ∗ a ⃗ ⋅ b ⃗ b ⃗ ⋅ b ⃗ = b ⃗ ∗ d o t ( a ⃗ , b ⃗ ) d o t ( b ⃗ , b ⃗ ) Proj_b^a = \frac{\vec{b}} {\left| \vec{b} \right|} * (\left| \vec{a} \right| * cos(\theta)) = \vec{b} * \frac{(\vec{a} \cdot \vec{b})} {\left| \vec{b} \right| \cdot \left| \vec{b} \right|} =\vec{b} * \frac{\vec{a} \cdot \vec{b}} { \vec{b} \cdot \vec{b}} = \vec{b}*\frac{dot(\vec{a},\vec{b})}{dot(\vec{b},\vec{b})} Projba=b b (a cos(θ))=b b b (a b )=b b b a b =b dot(b ,b )dot(a ,b )


参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值