游戏开发中,不同屏幕下的分辨率不同,模型/物品被拉伸之后贴图也会随之拉伸。
如果需要在不同比例下实现贴图真实大小不变(以下简称为自适应),需要对UV进行缩放处理之后再取得对应贴图的颜色。
本文提供一种能够实现不同设备下面贴图的大小不变的方法,主要是借助于DDX/DDY接口实现。
具体效果如下:
效果
材质预览放大
材质预览缩小
可以发现枪的显示变小了,但是里面的感叹号图片标志大小没变
前置知识
DDX()和DDY()
对于指定的寄存器,求其值在临近像素上的变化率,可以传入不同类型的数据, 就可以得到对应的数据在指定的屏幕坐标下的变化率。
讲更简单一点
比如ddx(uv)就是屏幕x方向上,一像素跨度内uv变化了多少
ddx(rgb)就是屏幕x方向上,一像素跨度内rgb变化了多少(无需指定xy,类似这样)
如何自适应
那么根据ddx和ddy的含义。我们可以传入uv坐标,取得在不同设备下面两个像素之间具体uv是多少(称之为ddx(u)和ddy(v)),然后让uv去除以这个deltUV之后乘某个系数再取颜色即可。
同一个设备里面像素大小的是不变的。
假设某个图形附上了这个材质,长包含n个像素宽包含m个像素,而像素大小是相同的,那么1/ddx(u)就是n,1/ddy(v)就是m。
我们传入 n * u,m * v,然后再从对应的材质里面取值
- u为1的时候取到 n,也就是贴图对应 U为n的位置;
- v为1的时候取到 n,也就是贴图对应 v为m的位置。
由于像素大小相同,所以n/m是几,取到的贴图就在几倍的位置,
可以尝试这样去理解:uv / ddxy相当于获得了uv对应的是第几个像素,而贴图总像素长度不变,所以传入的像素个数一定和贴图长度成比例关系。
当然像素很多,所以我们需要传个系数去乘(下图Param),防止取到过大的uv。
蓝图实现
如果使用的贴图是正方形,如下(这里Param1传贴图的长对应的总像素个数,Param2传贴图的宽对应的总像素个数就是1:1大小的关系)
这里有个很坑的地方哈,Divide结点是支持向量相除的,具体就是一维除一维,所以要保证维数相同。文章来源:https://www.toymoban.com/news/detail-485732.html
如图,Divide结点连到贴图uvs结点即可实现贴图自适应大小。文章来源地址https://www.toymoban.com/news/detail-485732.html
到了这里,关于UE4贴图自适应屏幕大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!