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防止纹理重复,但出现了纹理边缘沿垂直和水平方向拉伸填充空白的问题:
需要将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
相关产品推荐
相关产品推荐

