2012-03-11 7 views
2

これまでに尋ねられたことがあれば、私は許してください。私はこの一日中の答えを探していました。私が出てくるのはタイルベースの2Dゲームの助けです。 X〜Xスクリーンスペース内のテクスチャのセクションをどのようにタイルしますか?

私は各要素とそれらを伸ばすか、タイルにするオプションのポジションを持っているXMLファイルを使用して、Direct3Dの9でスキンを変更できるGUIを作成しようとしています。ストレッチは簡単な手順ですが、私はテクスチャの小さな部分をタイルする方法を理解することができませんでした。伝統的にテクスチャをタイル化するには、UV座標を> 1.0に設定するだけですが、ソーステクスチャ座標はテクスチャ全体の小さなサブセット(0.4〜0.5など)にすぎません。

私は本当に何かを明らかに逃した感がありますが、どのように私は単にタイリングの代わりに、ストレッチングに行きますか?私の推測では、複数のテクスチャ座標を持つこととは関係がありますが、そこからはどこに行くのか分かりません。

プロジェクトは現在、固定機能パイプラインを使用するため、可能な場合、私はそれを使って答えを好むだろうが、それが唯一の方法だ場合、私はシェーダを使用して答えを断るないでしょう。

答えて

1

テクスチャのサブセットのみをタイルしたいと思っています。それから事態が複雑になる。

たちはU1とU2の値の間のタイルのu-COORD、U1、U2 <にしたいとします。

適切な機能は同じで、V-COORDのために行くf(u) = frac(u) * (u2-u1) + u1

、それはせずにタイリングだとf(v) = frac(v) * (v2-v1) + v1

お知らせです

f(0.0) = u1 
f(0.5) = (u1+u2)/2 
f(0.9999) = u2 
f(1.0) = u1 
f(1.5) = (u1+u2)/2 
f(1.9999) = u2 
f(2.0) = u1 
and so on... 

ように、その後、我々は、関数f(U)が必要ですミラーリング。ミラーリングが必要な場合は、関数は、三角波関数t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5f(u) = t(u) * (u2-u1) + u1でなければなりません。しかし、三角関数を使うことは高価になる可能性があります。

それが固定されたパイプラインで可能かどうかは分かりませんが、あなたはピクセルシェーダ(HLSLコード)で簡単に行うことができます

// float2 tex_coord -> (u,v) from vertex shader, in [0,n] range, 
//      n - number of repetitions 
// float2 tex1, tex2 -> constants, subrange of [0,1] coords that will be tiled 

// no mirroring 
float4 color = tex2D(sampler, frac(tex_coord) * (tex2-tex1) + tex1); 

または

// mirroring, t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5 
float4 color = tex2D(sampler, t(tex_coord) * (tex2-tex1) + tex1); 

EDIT: より良いです三角波関数:t1(x) = abs(2(0.5x-floor(0.5x+0.5)))またはt2(x) = abs(2(frac(0.5x+0.5))-1)を計算する方法(正確にはt1と同じではありませんが、非負の数値に対しては正しい)です。私はに見てきた

+0

すべてが、それは悲しげに、固定機能パイプラインでそれを行うことは本当に不可能だ示していますが、それはあなたがピクセルシェーダコードについては、上記と超えて行く見てうれしいです。応答ありがとう:D – Addi

関連する問題