《Unity Shader 入门精要》笔记 01

描述:

今天看第十一章,其中 11.2.1 中的片元着色器看了很久才看明白,终于搞明白了为什么没有取余操作,特来记录下。

代码:

fixed4 frag (v2f i) : SV_Target {
	float time = floor(_Time.y * _Speed);  
	float row = floor(time / _HorizontalAmount);
	float column = time - row * _HorizontalAmount;				
	half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y / _VerticalAmount);
	uv.y -= row / _VerticalAmount;
	uv.x += column / _HorizontalAmount;				
	fixed4 c = tex2D(_MainTex, uv);
	c.rgb *= _Color;			
	return c;
}

理解:

  1. 核心就是用之前对整个纹理的采样坐标映射为对纹理中某一块的采样坐标。
  2. 首先代码中的纹理采用的是 Repeat 模式,这也就意味着 uv 坐标超出 1 的部分会直接取其余数很重要。示意图
  3. 由于是 Repeat 模式,上方示意图中每个大的正方形代表用到的纹理,纵向重复排列,红色方块代表当前选中的关键帧。计算过程如下。
  4. 首先time取整后可以简单看作从左往右,从上往下选中第几张图中的某一块,也就是块号
  5. row就可以代表行数,col代表列数,如图。
  6. 接着将uv坐标范围映射到小方块中,例如图中红色部分。
  7. 然后我们加上偏移量就可以得到真正的uv坐标了。直觉上直接加上对应的rowcol即可,但是不要忘了uv采样坐标是0~1范围内的,因此要把rowcol分别除以行数和列数,这个量才可以表示为真正的偏移量。
  8. 因此书中还有一种计算方式,将uv坐标直接与行列偏移量相加,然后再映射到小方块中(除以行数和列数)
half2 uv = i.uv + half2(column, -row);
uv.x /= _HorizontalAmount;
uv.y /= _VerticalAmount;

类似下面的图
在这里插入图片描述
最后,repeat 模式会自动取超过1的小数部分,就可以得到正确的 uv 坐标了。

如果发现描述有误,请在评论区指正,欢迎一起交流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值