为了我的游戏,我编写了一个着色器,可以使我的纹理在多个对象上良好平铺。我这样做是通过选择基于绝对世界位置的UV而不是基于顶点相对位置。自定义着色器如下所示。基本上它只是在1x1世界单位的网格中平铺纹理。
Shader "MyGame/Tile"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
//adjust UV for tiling
float2 cell = floor(IN.worldPos.xz);
float2 offset = IN.worldPos.xz - cell;
float2 uv = offset;
float4 mainTex = tex2D(_MainTex, uv);
o.Albedo = mainTex.rgb;
}
ENDCG
}
FallBack "Diffuse"
}
我以前在XNA上使用Cg和HLSL着色器实现过这种方法,一直都很成功。但是,在Unity着色器中,纹理边缘出现了非常明显的接缝。我尝试了Unity表面着色器和顶点/片段着色器,但结果相同。
现在我看到有人在这里遇到了类似的问题:灯光贴图时平面之间的接缝。 但是,没有确定性的答案来解决这样的问题。此外,我的问题与光照或灯光无关。 在我测试的片段着色器中,没有启用任何光照,但问题仍然存在。
同样的问题也被发布在Unity Answers网站上,但我没有收到答案,也没有得到很多的浏览量,所以我也在这里尝试:平铺纹理边界可见的接缝