HLSL - 如何设置采样器Min / Mag / Mip滤波器以禁用所有滤波/抗锯齿?

时间:2010-04-23 15:59:56

标签: directx hlsl direct3d9

我有一个tex2D采样器,我只想准确地返回纹理上存在的那些颜色。我使用的是Shader Model 3,因此无法使用load

如果纹理像素重叠多种颜色,我希望它选择一种并使整个纹理像素成为那种颜色。

我想这样做我想禁用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过滤,所以我不确定我需要将这些组合设置为什么,或者这是否是我所追求的。

我的源纹理的一部分看起来像;
http://img689.imageshack.us/img689/6171/sourcev.png http://img689.imageshack.us/img689/6171/sourcev.png

完整纹理映射到我的球体后相关区域的截图;
http://img717.imageshack.us/img717/9202/resultc.png http://img717.imageshack.us/img717/9202/resultc.png
抗锯齿/混合/过滤伪影清晰可见;我不想要这些。


MSDN有这个说法;

D3DSAMP_MAGFILTER:D3DTEXTUREFILTERTYPE

类型的放大过滤器

D3DSAMP_MINFILTER:D3DTEXTUREFILTERTYPE类型的缩小过滤器。

D3DSAMP_MIPFILTER:缩小过程中使用的Mipmap过滤器。见D3DTEXTUREFILTERTYPE

D3DTEXF_NONE:与D3DSAMP_MIPFILTER一起使用时,禁用mipmapping。

understanding hlsl intrinsics上的另一个好链接。


分辨

根本不是HLSL问题!对不起。我似乎问了很多无法回答的问题。食人魔过度使用上述设置。这是用;

修复的
Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);

3 个答案:

答案 0 :(得分:2)

从我看来,你从较低级别的mip-map(未经过滤)获得的值远远超过你所展示的最高细节。

MipFilter = None 
除非代码中的某些内容覆盖它,否则

应该阻止它。所以寻找对SetSamplerState的调用。

答案 1 :(得分:1)

如果您只想拥有一个纹素,请使用load代替sampleload采用(据我所知)int2作为参数,指定纹理中的实际数组坐标。 load然后查看给定数组坐标处纹理中的条目。

所以,只需缩放float2,例如使用ceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight))

MSDN for load:http://msdn.microsoft.com/en-us/library/bb509694(VS.85).aspx

当只使用着色器模型3时,你可能会有点破解:再次,我们假设你知道textureWidthtextureHeight

// 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;

我没有测试它,但我认为它可以工作。

答案 2 :(得分:1)

您所做的事情应该关闭过滤功能。尽管如此,我还是可以想到两个潜在的问题

1)驾驶员无论如何都会忽略你并过滤掉(如果发生这种情况,你无能为力) 2)您启用了某种形式的边缘抗锯齿。

看着你的结果图像看起来不像我的双线性过滤,所以我认为你正在某些地方打开抗锯齿。您是否在创建设备/渲染纹理时设置了抗锯齿标志?