3

私のゲームでは、テクスチャが複数のオブジェクトにきれいにタイル表示されるようにするシェーダーを作成しました。頂点の相対位置ではなく、絶対ワールド位置に基づいて 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

4

1 に答える 1

4

これはあなたの問題の理由を説明しています: http://hacksoflife.blogspot.com/2011/01/derivatives-i-discontinuities-and.html

これはあなたのような素晴らしい視覚的な例です: http://aras-p.info/blog/2010/01/07/screenspace-vs-mip-mapping/

ミップマップを無効にしない限り、これは Unity では解決できないと思います。なぜなら、私の知る限り、フラグメント シェーダーで使用するミップ レベルを指定できる関数を使用できないからです (少なくとも 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);
}
于 2013-04-03T15:51:38.190 に答える