0

我有一个 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://img717.imageshack.us/img717/9202/resultc.png


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);
4

3 回答 3

2

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

MipFilter = None 

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

于 2010-04-24T08:51:11.187 回答
1

如果您真的只想拥有一个纹素,请使用load而不是sample. load接受(据我所知) anint2作为参数,它指定纹理中的实际数组坐标。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;

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

于 2010-04-23T16:04:22.487 回答
1

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

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

看着你得到的图像对我来说看起来不像双线性过滤,所以我认为你正在遭受在某处打开抗锯齿的痛苦。创建设备/渲染纹理时是否设置了抗锯齿标志?

于 2010-04-23T16:48:29.680 回答