使用mipmap的纹理坐标不连续性会创建接缝


9

我刚刚开始学习openGL,并且在使用mipmap对球体进行纹理化时得到了此工件。基本上,当片段对我的纹理的边缘进行采样时,它会检测不连续性(例如从1到0)并选择最小的mipmap,从而创建此丑陋的接缝:

丑陋的缝http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

因此,我尝试使用textureGrad手动覆盖渐变:

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

现在我得到两个接缝,而不是一个。我该如何摆脱它们?为什么上面的代码会产生2个接缝?

2次Eams http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

您无法从两个图像中看出来,但是2个接缝位于​​原始接缝的两侧。


2
您的球体是网格,还是在着色器或类似工具中以解析方式射线跟踪球体?如果它是一个网格,人们通常通过复制顶点沿缝,使一侧的绿党可以有U = 0,另一侧具有u解决这个问题= 1
弥敦道里德

至于为什么您的代码生成两个接缝,我希望是因为它会创建两个不连续点-一个,其中u从0.01跳到0.5,而另一个u从0.99跳到0.5。这与u从0跳到1时的问题相同-跳得不那么大,但跳得仍然很大。
内森·里德

我有一个球体。这是一个十面体,因此顶点不会与接缝对齐。关于两个接缝的有趣之处在于原始接缝已消失。另外,即使将其钳位到.01或.99,我也会得到相同的2个接缝。
omikun

您可以张贴两幅情况的屏幕截图吗?而且,您如何生成UV(可以发布代码的相关部分)?我想您是在着色器中按程序生成它们的,而不仅仅是从顶点进行插值,否则您的十二面体网格将根本无法工作。
内森·里德

我用2个接缝的图片更新了问题,它们在原始接缝的两侧,但是原始接缝不存在。我认为UV是从顶点插值的,不确定。该代码是现在的问题。
omikun

Answers:


4

根据您发布的着色器代码,您不是要从顶点插值UV,而是要插值3D位置(fragVert),然后通过转换为球坐标来计算UV。

您的分析是正确的,因为不连续时会选择最小的mipmap,因为mipmap的选择基于导数,这些导数是根据相邻像素中使用的UV进行数值估算的。当一个像素的u = 0而另一个像素的u = 1时,您会得到非常大的导数。您尝试的修复方法存在相同的问题,因为较大的导数出现在u = 0.01和u = 0.99附近,这就是为什么两个接缝出现在原始接缝所在的两侧。

解决该问题的一种相对简单的方法是确定要使用自己的Mip级别并textureLod直接对其进行采样。如果行星总是要非常靠近相机,则可以将Mip级别硬编码为0(或者,就此而言,根本不将Mip级别包括在纹理中)。否则,它可能基于该点到相机的距离的log2,并由一些合适的因子进行缩放。请注意,这将有效地禁用各向异性过滤。

一种更“正确”的方法将是计算一些更高质量的导数。而不是使用的dFdxdFdy对UV的,其中有因间断atan2,你可以申请dFdx,并dFdyfragVert(这将是连续的球体周围所有的方式),然后使用一些微积分(连锁规则)来查找公式得到UV衍生品从位置衍生。这将更加复杂和缓慢,但是具有各向异性过滤应该起作用的优点。

最后,由于您是OpenGL的新手,我只是注意到,虽然根据球面坐标计算UV是对球体进行纹理化的一种完全有效的方法,但它并不是大多数人选择的“常规”方法。生成球面网格的更常见的方法是为每个顶点指定UV,然后将其从顶点着色器简单地传递到像素着色器(在每个三角形上线性插值)。顶点沿着接缝放置,像这样,使得每个顶点有两个副本,位于完全相同的位置,但是一半的u = 0连接到三角形,而另一半的u = 1连接到三角形。另一边的三角形。这样可以消除任何可见的接缝,并且不需要像素着色器中的任何技巧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.