HLSL-如何设置采样器最小/mag/mip滤波器以禁用所有过滤/抗声明?
题
我有一个TEX2D采样器,我只想准确地返回纹理上存在的那些颜色。我正在使用着着色器3型,所以不能使用 加载.
如果有多种颜色重叠,我希望它挑选一种颜色,并让整个Texel成为那种颜色。
我认为要这样做,我想禁用mipmapping或至少对MIP的三线性过滤。
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.
//...
};
我的问题是我不太了解最小/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-MAP(未经过滤)中获得的值,而不是您显示的最高细节。
MipFilter = None
除非代码中的某些内容将其覆盖,否则应该防止这种情况。因此,请寻找设置Samplerstate的呼叫。
其他提示
您所做的工作应关闭过滤。有两个潜在的问题,我可以想到
1)驱动程序只是忽略了您,无论如何,如果发生这种情况,您无能为力)2)您启用了某种形式的Edge Antialiasing。
查看您所产生的图像,看起来不像双线性过滤对我,所以我认为您因在某个地方打开抗血症而受苦。创建设备/渲染文本时,您是否设置了抗体标志?
如果您真的只有一个Texel,请使用 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型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;
我没有测试它,但我认为它可以起作用。