2

これが以前に尋ねられた場合は許してください。私はこれに対する答えを一日中探していました。私が思いついたのは、タイルベースの2Dゲームのヘルプだけです。x〜x

各要素の位置とそれらを拡大または並べて表示するオプションを含むXMLファイルを使用して、Direct3D9でスキナブルGUIを作成しようとしています。ストレッチは簡単な手順ですが、テクスチャの小さなセクションを並べて表示する方法を見つけることができませんでした。従来、テクスチャを並べて表示するには、UV座標を> 1.0に設定していましたが、ソーステクスチャ座標は、テクスチャ全体の小さなサブセット(0.4〜0.5など)にすぎません。

本当に明らかなことを見逃したような気がしますが、ストレッチするのではなく、単にタイリングする方法はありますか?私の推測では、複数のテクスチャ座標のセットがあることと関係がありますが、そこからはどこに行けばよいかわかりません。

プロジェクトは現在、固定関数パイプラインを使用しているので、可能であればそれを使用した回答を希望しますが、それが唯一の方法である場合は、シェーダーを使用した回答を拒否しません。

4

1 に答える 1

1

テクスチャのサブセットのみを並べて表示したいのですが、そうですか?その後、物事は複雑になります。

u1とu2の値の間でu-coordを並べて表示したいとします。u1<u2。

次に、関数f(u)が必要です。

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) = frac(u) * (u2-u1) + u1

同じことがv-coordにも当てはまります。f(v) = frac(v) * (v2-v1) + v1

ミラーリングせずにタイリングしていることに注意してください。ミラーリングが必要な場合、関数は三角波関数である必要があります。これは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);

編集:三角波関数を計算するためのより良い方法:t1(x) = abs(2(0.5x-floor(0.5x+0.5)))またはt2(x) = abs(2(frac(0.5x+0.5))-1)(t1とまったく同じではありませんが、非負の数を修正します)。

于 2012-05-06T21:16:00.070 に答える