我有一个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过滤,因此不确定我需要将它们设置在哪种组合中,或者是否是我所追求的。

我的源纹理的一部分是什么样的;
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);
有帮助吗?

解决方案

在我看来,您是从低级别的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时,您可以进行一些黑客攻击:再次假设您知道 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;

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top