0

tex2Dサンプラーがあり、テクスチャに存在する色だけを正確に返したいです。Shader Model 3を使用しているため、loadを使用できません。

テクセルが複数の色に重なっている場合は、1つを選択して、テクセル全体をその色にします。

これを行うには、ミップマッピング、または少なくともミップのトリリニアフィルタリングを無効にしたいと思います。

sampler2D gColourmapSampler : register(s0) = sampler_state {
    Texture = <gColourmapTexture>; //Defined above
    MinFilter = None; //Controls sampling. None, Linear, or Point.
    MagFilter = None; //Controls sampling. None, Linear, or Point.
    MipFilter = None; //Controls how the mips are generated. None, Linear, or Point.
    //...
};

私の問題は、Min / Mag / Mipフィルタリングを本当に理解していないので、これらをどの組み合わせに設定する必要があるのか​​、またはこれが私が求めているものであるかどうかさえわからないことです。

ソーステクスチャのどの部分がどのように見えるか。
http://img689.imageshack.us/img689/6171/sourcev.png

完全なテクスチャが球にマッピングされた後の関連領域のスクリーンショット。 アンチエイリアシング/ブレンディング/フィルタリングのアーティファクトがはっきりと表示されます。私はこれらが欲しくありません。
http://img717.imageshack.us/img717/9202/resultc.png


MSDNはこれを言っています。

D3DSAMP_MAGFILTER:タイプD3DTEXTUREFILTERTYPEの倍率フィルター

D3DSAMP_MINFILTER:タイプD3DTEXTUREFILTERTYPEの縮小フィルター。

D3DSAMP_MIPFILTER:縮小中に使用するミップマップフィルター。D3DTEXTUREFILTERTYPEを参照してください。

D3DTEXF_NONE:D3DSAMP_MIPFILTERとともに使用すると、ミップマッピングを無効にします。

hlsl組み込み関数を理解するためのもう1つの優れたリンク。


解決済み

HLSLの問題ではありません!申し訳ありません。答えられない質問がたくさんあるようです。Ogreは上記の設定を上書きしていました。これはで修正されました;

Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
4

3 に答える 3

2

私には、表示している最高の詳細よりも低いレベルのミップマップ(フィルタリングされていない)から値を取得しているように見えます。

MipFilter = None 

コード内の何かがそれをオーバーライドしない限り、それを防ぐ必要があります。したがって、SetSamplerStateの呼び出しを探します。

于 2010-04-24T08:51:11.187 に答える
1

テセルを1つだけにしたい場合は、loadの代わりにを使用しsampleます。load(私が知る限り)int2引数として、テクスチャ内の実際の配列座標を指定します。load次に、指定された配列座標でテクスチャのエントリを検索します。

float2したがって、たとえばを使用して、をスケーリングするだけceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight))です。

ロード用のMSDN:http: //msdn.microsoft.com/en-us/library/bb509694 (VS.85).aspx

textureWidthシェーダーモデル3だけを使用する場合、これを実現するために少しハックすることができます。繰り返しになりますが、あなたが知っていると仮定しましょうtextureHeight

// compute floating point stride for texture
float step_x = 1./textureWidth;
float step_y = 1./textureHeight;

// compute texel array coordinates
int target_x = texCoord.x * textureWidth;
int target_y = texCoord.y * textureHeight;

// round to values, such that they're multiples of step_x and step_y
float2 texCoordNew;
texCoordNew.x = target_x * step_x;
texCoordNew.y = target_y * step_y;

私はそれをテストしませんでしたが、私はそれがうまくいくと思います。

于 2010-04-23T16:04:22.487 に答える
1

行ったことは、フィルタリングをオフにする必要があります。私が考えることができる2つの潜在的な問題がありますが

1)ドライバーはあなたを無視し、とにかくフィルタリングします(これが発生している場合は、何もできません)2)何らかの形のエッジアンチエイリアシングが有効になっています。

結果として得られる画像を見ると、私には双一次フィルタリングのようには見えないので、どこかでアンチエイリアスがオンになっていることに苦しんでいると思います。デバイス/レンダリングテクスチャを作成するときにアンチエイリアスフラグを設定しましたか?

于 2010-04-23T16:48:29.680 に答える