LibGDX实现纹理单方向重复、另一方向拉伸的方法问询
实现单方向重复、另一方向拉伸的纹理效果
要实现X轴拉伸、Y轴重复的纹理效果,你可以通过控制纹理Wrap模式+调整UV坐标范围来达成,具体操作如下:
1. 设置Texture的Wrap模式
首先给纹理的Y轴设为Repeat(重复),X轴设为ClampToEdge——这里纠正一个误区:ClampToEdge不是重复边缘像素,而是把超出[0,1]范围的UV坐标钳制到0或1,配合正确的UV设置就能实现拉伸效果:
texture.setWrap(Texture.TextureWrap.ClampToEdge, Texture.TextureWrap.Repeat);
2. 调整TextureRegion的UV坐标
默认TextureRegion的UV范围是[0,1](覆盖整个纹理),要让Y轴重复,你需要扩大V坐标(对应Y轴)的范围,比如想让Y方向重复3次,就把V的最大值设为3;X方向保持[0,1]不变,这样绘制时X轴会自动把整个纹理拉伸到目标宽度:
// 创建自定义UV范围的TextureRegion,X轴0-1(拉伸),Y轴0-3(重复3次) TextureRegion stretchedRepeatedRegion = new TextureRegion(texture); // 用像素值设置范围,注意纹理最好是2的幂尺寸,否则Repeat可能失效 stretchedRepeatedRegion.setRegion(0, 0, texture.getWidth(), texture.getHeight() * 3); // 也可以直接用UV值设置 stretchedRepeatedRegion.setU(0f); stretchedRepeatedRegion.setU2(1f); stretchedRepeatedRegion.setV(0f); stretchedRepeatedRegion.setV2(3f);
3. 绘制纹理
绘制这个自定义的TextureRegion时,直接指定目标区域的尺寸即可:
batch.draw(stretchedRepeatedRegion, x, y, targetWidth, targetHeight);
这样X方向上整个纹理会被拉伸填满targetWidth的宽度,Y方向上纹理会重复3次来适配targetHeight的高度。
关于"Default"的说明
libGDX的Texture.TextureWrap枚举确实没有Default值,默认的Wrap模式就是ClampToEdge,之前觉得它不适用是因为没配合正确的UV坐标设置——现在固定X轴UV在[0,1]区间,就能实现纹理整体拉伸,而不是重复边缘像素。
内容的提问来源于stack exchange,提问作者ilya_kas
相关产品推荐
相关产品推荐

