我有一个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://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_MAGFILTER:D3DTEXTUREFILTERTYPE
类型的放大过滤器D3DSAMP_MINFILTER:D3DTEXTUREFILTERTYPE类型的缩小过滤器。
D3DSAMP_MIPFILTER:缩小过程中使用的Mipmap过滤器。见D3DTEXTUREFILTERTYPE。
D3DTEXF_NONE:与D3DSAMP_MIPFILTER一起使用时,禁用mipmapping。
understanding hlsl intrinsics上的另一个好链接。
根本不是HLSL问题!对不起。我似乎问了很多无法回答的问题。食人魔过度使用上述设置。这是用;
修复的Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
答案 0 :(得分:2)
从我看来,你从较低级别的mip-map(未经过滤)获得的值远远超过你所展示的最高细节。
MipFilter = None
除非代码中的某些内容覆盖它,否则应该阻止它。所以寻找对SetSamplerState的调用。
答案 1 :(得分:1)
如果您只想拥有一个纹素,请使用load
代替sample
。 load
采用(据我所知)int2
作为参数,指定纹理中的实际数组坐标。 load
然后查看给定数组坐标处纹理中的条目。
所以,只需缩放float2
,例如使用ceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight))
。
MSDN for load:http://msdn.microsoft.com/en-us/library/bb509694(VS.85).aspx
当只使用着色器模型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;
我没有测试它,但我认为它可以工作。
答案 2 :(得分:1)
您所做的事情应该关闭过滤功能。尽管如此,我还是可以想到两个潜在的问题
1)驾驶员无论如何都会忽略你并过滤掉(如果发生这种情况,你无能为力) 2)您启用了某种形式的边缘抗锯齿。
看着你的结果图像看起来不像我的双线性过滤,所以我认为你正在某些地方打开抗锯齿。您是否在创建设备/渲染纹理时设置了抗锯齿标志?