对于我的游戏,我编写了一个着色器,可以让我的纹理很好地平铺在多个对象上。我这样做是通过选择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"
}
我之前在Cg和HLSL着色器上完成了这种方法,它总是像魅力一样工作。但是,使用Unity着色器,我会在纹理的边缘处获得非常明显的接缝。我尝试了Unity表面着色器以及顶点/片段着色器,两者都具有相同的结果。
纹理本身如下所示。在我的游戏中,它实际上是 .tga ,而不是 .png ,但这不会导致问题。所有纹理过滤器设置以及重复或钳位模式均出现此问题。
现在我看到有人在这里遇到类似的问题:Seams between planes when lightmapping。 但是,对于如何解决这样的问题,没有明确的答案。此外,我的问题根本不涉及光照贴图或光照。在我测试的片段着色器中,没有启用照明,问题仍然存在。
同样的问题也发布在Unity答案网站上,但我没有收到任何答案,也没有收到很多意见,所以我也在这里尝试:Visible seams on borders when tiling texture
答案 0 :(得分:4)
这描述了您的问题的原因: http://hacksoflife.blogspot.com/2011/01/derivatives-i-discontinuities-and.html
这是一个很好的视觉示例,与您的一样: http://aras-p.info/blog/2010/01/07/screenspace-vs-mip-mapping/
除非您要禁用mipmap,否则我不认为这可以通过Unity解决,因为据我所知,它不会让您使用能让您指定mip的功能片段着色器中使用的级别(至少在OS X / OpenGL ES上;如果您仅针对Windows,这可能不是问题。)
那就是说,我不知道你为什么要进行碎片级uv计算。只是从顶点着色器传递数据工作正常,具有可平铺纹理:
struct v2f {
float4 position_clip : SV_POSITION;
float2 position_world_xz : TEXCOORD;
};
#pragma vertex vert
v2f vert(float4 vertex : POSITION) {
v2f o;
o.position_clip = mul(UNITY_MATRIX_MVP, vertex);
o.position_world_xz = mul(_Object2World, vertex).xz;
return o;
}
#pragma fragment frag
uniform sampler2D _MainTex;
fixed4 frag(v2f i) : COLOR {
return tex2D(_MainTex, i.position_world_xz);
}