代码之家  ›  专栏  ›  技术社区  ›  RJFalconer

hlsl-如何设置sampler min/mag/mip过滤器以禁用所有过滤/消除混叠?

  •  0
  • RJFalconer  · 技术社区  · 16 年前

    我有一个tex2d采样器,我只想精确地返回纹理上的那些颜色。我正在使用着色模型3,因此不能使用 load .

    如果一个texel重叠多个颜色,我希望它选择一个,并让整个texel是那个颜色。

    我认为要做到这一点,我要禁用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_磁滤波器:类型的放大滤波器 D3DTEXTUREFILTERTYPE

    d3dsamp_minfilter:类型的小型过滤器 D3D文本过滤器类型 .

    d3dsamp_mipfilter:缩小过程中使用的mipmap筛选器。见 D3D文本过滤器类型 .

    d3dtexf_none:与d3dsamp_mipfilter一起使用时,禁用mipmapping。

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


    断然的

    根本不是HLSL问题!对不起所有。我好像问了很多不可能回答的问题。食人魔已经超越了上述设置。这是固定的;

    Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Bahbar    16 年前

    在我看来,您从较低级别的mip映射(未过滤)中获取的值比显示的最高详细信息要低。

    MipFilter = None 
    

    应该防止这种情况发生,除非代码中的某些内容重写了它。所以寻找对setsamplerstate的调用。

        2
  •  1
  •   Goz    16 年前

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

    1)司机不管怎样都会忽略你和过滤(如果发生这种情况,你无能为力) 2)您启用了某种形式的边缘消除混叠。

    看看你得到的图像,在我看来,它不像双线性过滤,所以我认为你在某个地方被打开了抗锯齿。创建设备/渲染纹理时是否设置了抗锯齿标志?

        3
  •  1
  •   phimuemue    16 年前

    如果你只想要一个特克斯,用 load 而不是 sample . 负载 据我所知 int2 作为参数,指定纹理中的实际数组坐标。 负载 然后在给定数组坐标处查找纹理中的条目。

    所以,只要按比例 float2 ,例如通过使用 ceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight)) .

    用于负载的MSDN: http://msdn.microsoft.com/en-us/library/bb509694(VS.85).aspx

    当只使用shader model 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;
    

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

    推荐文章