HLSL-すべてのフィルタリング/アンチエイリアシングを無効にするために、サンプラーMIN/MAG/MIPフィルターを設定するにはどうすればよいですか?
質問
Tex2Dサンプラーがあります。テクスチャーに存在する色のみを正確に返したいと思います。私はシェーダーモデル3を使用しているので、使用できません ロード.
テクセルが複数の色を重複させた場合、私はそれを選んで、テクセル全体をその色にしてもらいたいです。
これを行うために、MIPMAPPING、または少なくともMIPSのトライリンフィルタリングを無効にしたいと思います。
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フィルタリングを本当に理解していないことです。そのため、これらを設定する必要がある組み合わせ、またはこれが自分の後のものであるかどうかはわかりません。
全テクスチャが私の球体にマッピングされた後、関連する領域がどのように見えるかのスクリーンショット。
アンチエイリアシング/ブレンド/フィルタリングアーティファクトがはっきりと見えます。私はこれらを望んでいません。
MSDN これを言うことがあります。
D3DSAMP_MAGFILTER:タイプの倍率フィルター d3dtexturefiltertype
D3DSAMP_MINFILTER:タイプのミニフィッシュフィルター d3dtexturefiltertype.
D3DSAMP_MIPFILTER:MIPMAPフィルターは、縮小中に使用します。見る d3dtexturefiltertype.
d3dtexf_none:d3dsamp_mipfilterで使用すると、mipmappingを無効にします。
別の良いリンク HLSLの内因性を理解する.
解決しました
HLSLの問題ではありません!申し訳ありません。答えることが不可能な多くの質問をしているようです。 Ogreは上記の設定をオーバーライドしていました。これはで修正されました。
Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
解決
私に見えるのは、あなたが表示している最高の詳細よりも低いレベルのMIPマップ(フィルター処理)から値を取得しているということです。
MipFilter = None
コード内の何かがそれを無効にしない限り、それを防ぐ必要があります。したがって、SetSamplerStateへの呼び出しを探してください。
他のヒント
あなたがしたことはフィルタリングをオフにするはずです。私が考えることができる2つの潜在的な問題がありますが、
1)ドライバーはあなたを無視し、とにかくフィルターを無視します(これが起こっている場合、あなたにできることは何もありません)
私にとって双線形フィルタリングのように見えない結果の画像を見ると、あなたはどこかでアンチアリアーシングをオンにすることに苦しんでいると思います。デバイス/render-textureを作成するときに、アンチアリアーシングフラグを設定しましたか?
本当に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
シェーダーモデル3のみを使用する場合、これを達成するために少しハッキングできます。繰り返しますが、あなたが知っていると仮定しましょう textureWidth
と 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;
私はそれをテストしませんでしたが、うまくいくと思います。