You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot Shader问题:平面网格纹理边缘拉伸,需分配4张纹理无重叠

解决UV分区域显示多张纹理时的边缘拉伸问题

我有一个附加了Shader的简单平面网格,Shader代码如下:

shader_type spatial;  
uniform sampler2D texture_0: repeat_disable; 
uniform sampler2D texture_1: repeat_disable; 
uniform sampler2D texture_2: repeat_disable; 
uniform sampler2D texture_3: repeat_disable;  

void fragment(){     
    ALBEDO = texture(texture_0,UV*2).rgb; 
}

原本想通过UV*2将平面划分为4个区域,同时用repeat_disable防止纹理重复,但出现了纹理边缘沿垂直和水平方向拉伸填充空白的问题:
Stretching texture borders

需要将4张纹理分配到平面的4个区域且互不重叠,该如何解决?


问题出在repeat_disable的行为——当UV坐标超出[0,1]范围时,采样器会固定取纹理的边缘像素,导致拉伸。要实现4张纹理分区域显示,需要根据UV所在区域选择对应纹理,并将每个区域的UV重新映射回[0,1]区间。

修改后的Shader代码如下:

shader_type spatial;  
uniform sampler2D texture_0: repeat_disable; 
uniform sampler2D texture_1: repeat_disable; 
uniform sampler2D texture_2: repeat_disable; 
uniform sampler2D texture_3: repeat_disable;  

void fragment() {
    vec2 scaled_uv = UV * 2.0;
    
    // 划分四个区域并采样对应纹理
    if (scaled_uv.x < 1.0 && scaled_uv.y < 1.0) {
        // 左下区域:texture_0
        ALBEDO = texture(texture_0, scaled_uv).rgb;
    } else if (scaled_uv.x >= 1.0 && scaled_uv.y < 1.0) {
        // 右下区域:texture_1,UV减去x方向偏移量
        ALBEDO = texture(texture_1, scaled_uv - vec2(1.0, 0.0)).rgb;
    } else if (scaled_uv.x < 1.0 && scaled_uv.y >= 1.0) {
        // 左上区域:texture_2,UV减去y方向偏移量
        ALBEDO = texture(texture_2, scaled_uv - vec2(0.0, 1.0)).rgb;
    } else {
        // 右上区域:texture_3,UV减去x和y方向偏移量
        ALBEDO = texture(texture_3, scaled_uv - vec2(1.0, 1.0)).rgb;
    }
}

代码说明:

  • scaled_uv = UV * 2.0:将原UV(范围[0,1])放大到[0,2],把平面分成4个[0,1]x[0,1]的子区域
  • 每个分支判断scaled_uv所在的象限,对应当前区域要显示的纹理
  • 通过减去对应方向的偏移量(vec2(1.0,0.0)或vec2(0.0,1.0)),将子区域的UV重新映射回[0,1],确保纹理正常显示,不会触发repeat_disable的边缘拉伸行为

这样就能让4张纹理分别填充平面的四个区域,且互不重叠、无拉伸问题。

内容的提问来源于stack exchange,提问作者Metaponta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:00:21