【问题标题】:HLSL - How can I set sampler Min/Mag/Mip filters to disable all filtering/anti-aliasing?HLSL - 如何设置采样器 Min/Mag/Mip 过滤器以禁用所有过滤/抗锯齿?
【发布时间】:2010-04-23 15:59:56
【问题描述】:

我有一个 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 过滤,所以我不确定我需要将它们设置成什么组合,或者这是否是我所追求的。

我的源纹理的一部分是什么样的;

完整纹理映射到我的球体后相关区域的截图;

抗锯齿/混合/过滤伪影清晰可见;我不要这些。


MSDN有话要说;

D3DSAMP_MAGFILTER:D3DTEXTUREFILTERTYPE 类型的放大过滤器

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

D3DSAMP_MIPFILTER:在缩小期间使用的 Mipmap 过滤器。见D3DTEXTUREFILTERTYPE

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

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


已解决

根本不是 HLSL 问题!对不起大家。我似乎问了很多无法回答的问题。 Ogre 覆盖了上述设置。这已修复;

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

【问题讨论】:

    标签: directx hlsl direct3d9


    【解决方案1】:

    在我看来,您从较低级别的 mip-map(未过滤)获取值,而不是您显示的最高细节。

    MipFilter = None 
    

    应该阻止这种情况,除非代码中的某些内容覆盖了它。所以寻找对 SetSamplerState 的调用。

    【讨论】:

    • 没有电话。其他采样器确实有不同的 sampler_states。
    • @RJFalconer:那么,您确定您使用正确的效果进行相关抽奖吗?
    • 嘎。我确实启用了过滤。 Ogre 正在覆盖着色器并自己进行纹理过滤。用“Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE, Ogre::FO_NONE, Ogre::FO_NONE);”修复。
    【解决方案2】:

    您所做的应该关闭过滤。不过,我可以想到两个潜在的问题

    1) 驱动程序只是忽略您并过滤(如果发生这种情况,您无能为力) 2)您启用了某种形式的边缘抗锯齿。

    查看您生成的图像,这在我看来不太像双线性过滤,所以我认为您在某处启用了抗锯齿功能。您在创建设备/渲染纹理时是否设置了抗锯齿标志?

    【讨论】:

    • 咳咳。是的,好电话。 :$。该应用程序位于 Ogre 中,它确实具有抗锯齿功能,确实已启用。然而,我想从这个纹理中取样,而不是绘制它,所以我认为这不是问题。我目前正在绘制它作为测试。令人困惑的是,禁用抗锯齿仍然会显示相同的伪影。
    • 那你想要什么?您是否希望浅灰色不应用于对象?或者你想在纹理的暗部分边缘产生阶梯锯齿效果?
    • @RJFalconer:抗锯齿不是全局属性,它是渲染目标的属性。也就是说,我被图片弄糊涂了。你的原始界限在哪里?抗锯齿应该只在那里显示它的效果。图元边界是否与纹理不连续性对齐?
    • @Bahbar:大多数形式的抗锯齿不只是抗锯齿多边形边界。 2x 超级采样将大小渲染为 4 倍,然后将每 4 个像素平均为 1 个。这将模糊所有内容以及多边形边缘。 4 点击多重采样将产生类似的效果,因为它会生成 4 个样本,然后将它们混合成 1 个像素。
    • @Goz:是的,SSAA 会,但这不是 AA 对渲染目标的控制。它(主要是我见过的所有卡片)控制 MSAA,它只影响边缘边界上的结果(片段着色器每个像素运行一次,为三角形覆盖的每个样本存储。如果三角形覆盖所有样本像素,那么就好像你在没有 AA 的情况下运行,这就是我相信这里发生的情况)。
    【解决方案3】:

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

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

    加载的 MSDN: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;
    

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

    【讨论】:

    • 啊,太完美了。唉,我只能使用 Shader Model 3,而且这只是 4+。不过 +1,因为我没有指定。
    • 我已经解决了我的问题,但是出于兴趣,你能解释一下你编辑的答案吗?我不明白shader model 3 hack。你将 texCoordNew 传递给什么?
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多