编辑:我发现问题类似于问题here,但我仍然不能提出解决方案,因为我的问题有点不同。手动包装纹理坐标
我正在使用C++和HLSL,并需要将纹理坐标包裹起来,以便纹理平铺在三角形上。
坐标被“包裹”到0-1范围后,它们将被旋转,所以我不能简单地使用纹理采样器AddressU和AddressV属性设置为包装,因为它们需要被包装然后旋转,所以它可以在采样器内部不要做。
这里的解决方案很简单,只需使用纹理坐标的小数部分即可。
这里是一个像素着色器的一个例子将瓦片纹理36倍(6×6) -
input.tex *= 6.0f; //number of times to tile^2
input.tex = frac(input.tex); //wraps texCoords to 0-1 range
return shaderTexture.Sample(SampleType, input.tex);
这确实瓦的纹理,但可以在边界其中产生问题纹理包装。这些瓷砖必须均匀分配到它们正在显示的空间上,或者它会在边界相交处形成一个接缝。我的正方形纹理被绘制到800x600像素,所以平铺5将平均分割,但6不会,并将导致沿Y轴的接缝。
我已经尝试使用模运算符input.tex = input.tex % 1
来包裹坐标,但我得到完全相同的结果。我也尝试改变纹理过滤方法,AddressU和AddressV属性以及无数种不同的调试方法。
我有一些运气使用此代码。如果x坐标过高它被设置为0,如果是太低,它被设置为1
input.tex *= 6.0f;
input.tex = frac(input.tex);
if (input.tex.x > 0.999f) input.tex.x = 0;
if (input.tex.x < 0.001f) input.tex.x = 1;
return shaderTexture.Sample(SampleType, input.tex);
这仅仅修复在特定的地点的问题了,所以它绝对不是一个解决方案。
这张图片显示了一个纹理(左)和手动包装时的样子(右)。你可以看到寄宿生触及的并不是每个地方都有这个错误。
我也试过没有改变纹理坐标到0-1的范围,并围绕每个瓷砖的中心而不是(0.5,0.5)旋转它们,但是我得到了相同的结果。此外,我的纹理坐标完全独立于顶点,并在像素着色器内进行计算。
我看到的与这个问题有关的任何事情都与一个像素具有高值并且接下来具有较低值有关,例如u = 0.95和下一个像素u = 0.03,这导致它向后插入纹理。但是当我旋转我的纹理坐标时,根本没有任何变化。即使每个图块都应用了随机旋转。在这种情况下,边缘具有彼此接近的各种不同的值,不仅左侧高值而右侧低值,而且接缝发生的区域不会改变。
我一直在想我希望有一种方法来找出像素之间的变化,这工作完美,并保持mipmap水平在一个常数0工作,所以我相信你是正确的,这是一个mipmapping问题。非常感谢! – Frobot 2015-02-17 18:28:38
我添加了一个答案,显示了我是如何实现这个 – Frobot 2015-02-17 22:43:25