【发布时间】:2013-04-03 08:52:56
【问题描述】:
对于我的游戏,我编写了一个着色器,可以让我的纹理很好地平铺在多个对象上。我不是根据顶点的相对位置,而是根据绝对世界位置来选择 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 表面着色器以及顶点/片段着色器,两者的结果相同。
纹理本身如下所示。在我的游戏中,它实际上是一个 .tga,而不是 .png,但这不会导致问题。该问题出现在所有纹理过滤器设置以及重复或钳位模式上。
现在我看到有人在这里遇到类似的问题:Seams between planes when lightmapping。 然而,对于如何解决这样的问题,没有明确的答案。此外,我的问题根本与光照贴图或照明无关。在我测试的片段着色器中,没有启用光照,问题仍然存在。
同样的问题也发布在 Unity 回答网站上,但我没有收到任何回答,也没有太多的浏览量,所以我也在这里尝试:Visible seams on borders when tiling texture
【问题讨论】:
-
On your texture,尝试将
Wrap Mode更改为“Clamp”。 -
正如我所说:所有纹理过滤器设置和重复或钳制模式均会出现问题。
-
Ack,我用 grep 表示“换行模式”,而不是钳位。
-
一定要使用 MipMaps。看看有没有帮助。
-
您不需要自己实现 frac。 http.developer.nvidia.com/Cg/frac.html
标签: unity3d shader textures fragment-shader tiling