我正在使用Silverlight应用程序。我正在尝试用瓷砖覆盖地板。尽管我使用的是Mip贴图,但在尝试渲染大面积区域时仍会出现可怕的摩尔纹图案。

我正在做的是创建长方体,然后用单个图块覆盖它:



在我的像素着色器中,我要乘以纹理坐标以创建平铺地板(否则我将在我的长方体上拉伸一个平铺)。像素着色器代码:

float Width                 : register(c3);                  //Width of cuboid
float Height                : register(c4);                  //Height of cuboid

texture texTexture;
sampler textureSampler  : register(s0) = sampler_state {
    Texture = (texTexture);
};

struct VsOutput
{
    float4 position : POSITION;
    float3 dirLightPosition : COLOR;
    float2 texCoord : TEXCOORD0;
    float3 normal   : TEXCOORD1;
    float3 view : TEXCOORD2;
};

float4 main(VsOutput IN) : COLOR
{
    float2 texCoord = float2(IN.texCoord.x * Width / 4.0f, 
                             IN.texCoord.y * Height / 4.0f); //multiplying texture coordinates


    float4 texColor = tex2D(textureSampler, texCoord);

    return float4(color.r, color.g, color.b, 1.0f);
}


我的输出是:



我还能做些什么来防止在纹理上创建摩尔纹图案?

评论

您是否已验证实际使用过mipmap?屏幕截图看起来像是双线性过滤,而不是三线性过滤,

@JulienGuertault可能只是我的视力不好,但我看不到任何明显的间断,只能表示双线性+最近的MIP映射。

实际上,我的采样器状态设置为AnisotropicWrap,我认为这是最好的。另外,我100%确定使用了mipmaps。

@SimonF:抱歉,我的意思是线性的。但是无论如何,显然问题出在其他地方。

@Nero我是这样做的:)

#1 楼

有两件事情要引起注意:


生成较小的Mip贴图时,请尝试避免使用简单的2x2框式滤镜,因为尽管便宜又令人愉悦,但它们去除高点的效果确实很差频率信息(超过奈奎斯特极限),以及对需要保留的某些较低频率信息进行过过滤。 (此外,此外,您需要在线性空间中执行MIP映射生成。如果您的源数据是sRGB,则需要与线性映射或从线性映射生成)。 FWIW,在Williams撰写的有关MIP映射的原始论文中,他说他使用“盒子(傅立叶)窗口”来生成预滤波的水平,这将是图像空间中的一个正弦函数。
标准三线性滤波也将过度并过滤掉部分纹理。如果您不喜欢混叠,则可能必须a)调整偏置以增加滤波(这会增加模糊)和/或b)尝试使用各向异性滤波。


评论


$ \ begingroup $
对不起,也许是愚蠢的问题,但是“ 2x2框式过滤器”是什么?还有其他名字吗?
$ \ endgroup $
–bartosz.baczek
2015年10月7日14:18



$ \ begingroup $
我只是说过一种幼稚的方法,即从其上方的2X * 2Y级别生成下一个较低的X * Y MIP映射级别。即将较高级别的2x2纹素平均生成较低级别的相应纹素。它很便宜,但不是很好。即使是简单的4x4帐篷滤镜也可以产生更好的结果。
$ \ endgroup $
–西蒙F
2015年10月7日14:25

$ \ begingroup $
为了确保我完全了解您-现在,我正在创建这样的mip映射:pastebin.com/nX1MVvEp。相反,我应该从原始纹理以原始大小生成mipmap,是吗?
$ \ endgroup $
–bartosz.baczek
2015年10月7日14:34

$ \ begingroup $
好吧,我不知道“调整大小”功能的内容,因此很难回答。链接,即。只要“调整大小”中的内容正常,1024生成512、512生成256等就不会成为一个大问题。作为实验,您是否可以创建一个1024 ^ 2纹理,该纹理全部为0xFFFFFF,除了您将左上像素设置为纯红色(0x0000FF)。您在512 ^ 2结果中得到什么?
$ \ endgroup $
–西蒙F
2015年10月7日14:47

$ \ begingroup $
我的结果:postimg.org/image/atd8nc4j3/3636ad65
$ \ endgroup $
–bartosz.baczek
2015年10月7日14:55

#2 楼

解决方案

我设法通过增加2048x2048px的纹理大小来解决我的问题,因此将生成更多的mipmap。同样,将我的SamplerState各向异性形式更改为类似的方法也有帮助:现在看起来像这样:



评论


$ \ begingroup $
镜子可能会定义重复纹理时会发生什么。在正常模式下(仅考虑水平),如果您的纹理看起来像“ <”,则将得到“ <<<<<<”。通过镜像,您将获得“ <> <> <> <> <”。显然也可以应用于垂直方向。
$ \ endgroup $
–西蒙F
2015年10月9日在16:15

$ \ begingroup $
看起来提高分辨率是主要的帮助。在矩形的后角几乎没有形成波纹图案。
$ \ endgroup $
–RichieSams
2015年10月9日在16:32

$ \ begingroup $
实际上,镜像不能完成大部分工作:)我仅通过镜像并仅以更大的纹理进行了测试,结果证明该镜像可以提供出色的效果。 Fortunatelly瓷砖纹理是对称的,因此没什么大不了的。
$ \ endgroup $
–bartosz.baczek
2015年10月9日在16:38

$ \ begingroup $
由于平面不像问题中的示例那样延伸到距离内,因此很难判断这种改进有多大。
$ \ endgroup $
– trichoplax
15年10月16日在7:55