1

私はここに見られるようにランプ効果を達成しようとしています:( 出典:splashdamage.com

分布パターンに基づいてテクスチャをブレンドするのは簡単です。基本的に、これだけ(HLSL):

Result = lerp(SampleA, SampleB, DistributionPatternSample);

これは機能しますが、ランプはありません。 http://aaronm.nuclearglory.com/private/stackoverflow/result1.png

私の最初の推測は、「ランプファクター」を組み込むためにこれを行うことができるということでした。

Result = lerp(A, B, (1.0f - Ramp)*Distribution);

ただし、ランプも1.0の場合、結果はゼロになり、「A」だけが使用されるため、これは機能しません。これは、その方法でランプが1.0fのときに得られるものです:http: //aaronm.nuclearglory.com/private/stackoverflow/result2.png

ランプに分布を掛けようとしましたが、これは明らかに正しくありません。(興味深い効果を試してみる価値があると考えました。興味深い効果は発見されませんでした。)

また、次のように、分布からランプを差し引くことも試みました。

Result = lerp(A, B, saturate(Distribution - Ramp));

しかし、それに関する問題は、ランプがブレンドのシャープネスを制御することを目的としていることです。だから、それも実際には何もしません。

数学的に、これを達成するために私が何をする必要があるかを誰かが教えてくれることを願っています。これはシェーダーコードであるため、分岐を避けようとしています。結果を乗算することで分岐をシミュレートできますが、これは行いたくありません。私はまた、なぜ数学が鋭さのためにあるように定式化されているのかについて誰かが私に記入してくれることを望んでいます。使い方がわからないまま数学を投げ回すのは面倒です。

コンテキストとして、その一番上の画像はここから取得されました。 http://wiki.splashdamage.com/index.php/A_Simple_First_Megatexture

MegaTextures(クリップマップアプローチ)とVirtual Texturing(より高度なアプローチ)がどのようにうまく機能するかを理解しています。ですから、それについての説明は必要ありません。この特定のブレンドをシェーダーに実装しようとしています。

参考までに、これは私が使用している分布パターンテクスチャです。
http://aaronm.nuclearglory.com/private/stackoverflow/distribution.png

4

1 に答える 1

1

それらのランプ幅は、基本的に、分布マップ上の単なるコントラストの変化です。これの野蛮なバージョンは、単純な再スケーリングとクランプです。

保存したいのは、0.5が0.5にマップされ、テクスチャが幅wの領域で0から1になることです。

これは与える

x = 0.5 + (x-0.5)/w

これは、最終的なHLSLが次のようになることを意味します。

Result = lerp(A, B, clamp( 0.5 + (Distribution-0.5)/w, 0, 1) );

これでエッジがギザギザに見える場合は、smoothstepの使用に切り替えることができます。シッチの場合、あなたは得るでしょう

Result = lerp(A, B, smoothstep( 0.5 + (Distribution-0.5)/w, 0, 1) );

ただし、ここで覚えておくべきことの1つは、このタイプのしきい値処理は、滑らかな分布パターンで最適に機能することです。あなたが十分に滑らかになるかどうかはわかりません(それがメガテクスチャの小さなバージョンである場合を除いて、その場合はおそらく大丈夫です)。

于 2012-07-27T01:35:26.843 に答える