オブジェクトの領域をその場所に応じて異なる方法でレンダリングする必要があるコードがあります。これらの領域を定義するためにカラー マップを使用しようとしています。
問題は、カラー マップからサンプリングするときに衝突が発生することです。つまり、カラーマップ内の異なる色を持つ 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;
};