3

オブジェクトの領域をその場所に応じて異なる方法でレンダリングする必要があるコードがあります。これらの領域を定義するためにカラー マップを使用しようとしています。

問題は、カラー マップからサンプリングするときに衝突が発生することです。つまり、カラーマップ内の異なる色を持つ 2 つの領域は、サンプラーから同じ値が返されます。

カラーマップのさまざまな形式を試しました。それぞれの場合で、各領域の色が「5」離れているように設定しました。

  • インデックス付きの色
  • RGB、RGBA : 領域 1 は RGB 5%、5%、5% になります。リージョン 2 には、RGB 10%、10%、10% などがあります。
  • HSV グレースケール: 領域 1 の HSV は 0,0,5% になります。リージョン 2 の HSV は 0、0、10% などになります。

(The Gimp で選択された値)

tex2D サンプラーは値 [0..1] を返します。

[次に、リージョンから int 配列インデックスを導出するつもりです。それを行うコードは無関係なので、質問から削除されました]

float region = tex2D(gColourmapSampler,In.UV).x;

「5%」の色をサンプリングすると、hlsl で 0.05098 の「領域」が得られました。このことから、5% は 5/100*255、つまり 12.75 を表し、テクスチャに格納されると 13 に丸められると仮定します。(推論: 0.05098 * 255 ~= 13)

このロジックにより、50% は 127.5 として格納されます。
サンプリングすると、0.50196 が得られます。これは、128 として格納されたことを意味します。

70% は 178.5 として保存する必要があります。
サンプリングすると、0.698039 が得られます。これは、178 として格納されたことを意味します。

ここでどのような丸めが行われていますか?
(127.5が128に、178.5が178に?!)

編集: OK、 http: //en.wikipedia.org/wiki/Bankers_rounding#Round_half_to_even どうやらこれは「銀行家の丸め」です。なぜこれが使用されているのかわかりませんが、問題は解決します。どうやら、それはGimpの問題です。


Shader Model 2 と FX Composer を使用しています。これは私のサンプラ宣言です。

//Colour map
texture gColourmapTexture <
    string ResourceName = "Globe_Colourmap_Regions_Greyscale.png";
    string ResourceType = "2D";
>;
sampler2D gColourmapSampler : register(s1) = sampler_state {
Texture = <gColourmapTexture>;
#if DIRECT3D_VERSION >= 0xa00
    Filter = MIN_MAG_MIP_LINEAR;
#else /* DIRECT3D_VERSION < 0xa00 */
    MinFilter = Linear;
    MipFilter = Linear;
    MagFilter = Linear;
#endif /* DIRECT3D_VERSION */
    AddressU = Clamp; 
    AddressV = Clamp;
};   
4

3 に答える 3

1

GIMPは銀行家の丸めを使用します。どうやら。

これにより、リージョンインデックスを導出するためのコードが破棄されました。

于 2010-04-21T13:59:05.610 に答える
1

私は HLSL を使用したことはありませんが、しばらく前に GLSL を使用したことはあります (そして、それが私の頭の中でひどく遠いことを認めなければなりません)。

テクスチャに関して私が抱えていた問題の 1 つは、0 が最初のピクセルではないことです。1は2番目ではありません。0 はテクスチャの端、1 は最初のピクセルの右端です。値は自動的に補間されるため、通常のテクスチャを適用するのではなく、ルックアップ テーブルを適用する場合のように精度が必要な場合、深刻な問題が発生する可能性があります。ピクセルの中央を目指す必要があるため、[0,0]、[1, 0] などではなく [0.5,0.5]、[1.5,0.5] を求めます。

少なくとも、GLSL ではそうでした。

于 2010-04-20T14:43:53.377 に答える
1

注意: レベルの地域[地域] は切り捨てられます。イメージ エディタで 5 % と表示されている場合、テクスチャ 8b 表現の実際の値は 5/100*255 = 12.75 で、12 または 13 のいずれかになります。12 の場合、切り捨てが発生します。最も近いものに丸めたい場合は、これを level[region+0.5] に変更する必要があります。

あなたを襲うかもしれないもう 1 つの同様のこと (Louis-Philippe によって既に書かれています) は、テクスチャ座標の丸め規則です。2 つのテクセルの中間にならないように、常にテクセル内のスポットをヒットする必要があります。そうしないと、結果が不明確になり (2 つのいずれかがランダムに取得される可能性があります)、ソース テクセルの一部が消失し、他の重複が発生する可能性があります。これらのルールは、バイリニアとポイント サンプリングでは異なります。これを補うために、サンプリング時にテクセル サイズの半分を追加する必要がある場合があります。

于 2010-04-20T14:55:11.440 に答える