スクリーンスペースでテクスチャのセクションをどのようにタインしますか?
-
11-12-2019 - |
質問
これが前に尋ねられたら私を許してください、私はこの一日中この一日に答えを探しています、そして私が思い付くのはタイルベースの2Dゲームの助けを借りています。 X~X
各要素の位置を持つXMLファイルと、ストレッチまたはタイルをタイルするオプションを使用して、Direct3D 9にスキン可能なGUIを作成しようとしています。ストレッチは簡単な手順ですが、テクスチャの小さな部分をタイルする方法を理解することができませんでした。伝統的にテクスチャをタイルする私はちょうどUV座標を> 1.0に設定するでしょうが、ソースのテクスチャ座標はテクスチャ全体の小さなサブセットになるでしょう。
私は私が本当に明白な何かを逃した感じを持っていますが、ストレッチの代わりに単にタイルを模索しますか?私の最善の推測は、それが複数のテクスチャ座標を持っていることと関係があるものですが、そこから、どこに行くべきかわからない。
現在固定機能パイプラインを使用しているので、可能であれば答えを使用することをお勧めしますが、それが唯一の方法である場合はシェーダを使用する答えを停止しません。
解決
あなたがテクスチャのサブセットのみをタイルすることを望むことを理解していますね。それから物事は複雑になります。
U1とU2の値、U1
それから関数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.5
とf(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と全く同じではなく、負の負の数は正しくない)。