私のゲームでは、テクスチャが複数のオブジェクトにきれいにタイル表示されるようにするシェーダーを作成しました。頂点の相対位置ではなく、絶対ワールド位置に基づいて 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 と XNA の HLSL シェーダーでこのアプローチを行ったことがありますが、常に魅力的に機能しました。ただし、Unity シェーダーを使用すると、テクスチャの端に非常に目立つ継ぎ目ができます。Unity サーフェス シェーダーと頂点/フラグメント シェーダーを試しましたが、どちらも同じ結果でした。
テクスチャ自体は次のようになります。私のゲームでは、実際には.pngではなく.tgaですが、問題は発生しません。この問題は、すべてのテクスチャ フィルタ設定で発生し、リピート モードまたはクランプ モードでも同様に発生します。
今、誰かがここで同様の問題を抱えているのを見てきました:ライトマッピング時のプレーン間の継ぎ目。しかし、そのような問題を解決する方法について決定的な答えはありませんでした。また、私の問題はライトマップや照明とはまったく関係ありません。私がテストしたフラグメント シェーダーでは、ライティングが有効になっておらず、問題は依然として存在していました。
同じ質問が Unity の回答サイトにも投稿されましたが、回答が得られず、多くのビューも得られなかったので、ここでも試しています: Visible seams on borders when tiling texture