处理超出范围 [0,1] 的 UV 值时出现锯齿状线条
Jagged lines while handling UV values out of range [0,1]
我正在解析纹理坐标大于 1 且小于 0 的 OBJ。然后我通过使 UV 值在 [0,1] 范围内写回它。基于对 another question on SO 的理解,我正在按如下方式转换到范围 [0,1]。
if (oldU > 1.0) or (oldU < 0.0):
oldU = math.modf(oldU)[0] # Returns the floating part
if oldU < 0.0 :
oldU = 1 + oldU
if (oldV > 1.0) or (oldV < 0.0):
oldV = math.modf(oldV)[0] # Returns the floating part
if oldV < 0.0:
oldV = 1 + oldV
但是我在输出的 obj 文件和在某些软件中呈现的原始 obj 文件中看到一些锯齿状线条:
原创
限于 [0,1]
这可能不会像您预期的那样工作。
给定一些从 U=0.9
开始并在 U=1.1
结束的三角形边,然后在你的 UV 裁剪之后你将从 0.9
开始但在 0.1
结束所以三角形将使用纹理的不同部分。我相信这发生在你的网格底部。
一般来说,在 0-1 范围之外使用 UV 没有问题,所以首先尝试按原样渲染网格,看看是否有任何问题。
如果您真的想将 UV 移动到 0-1 范围,则缩放和移动 UV,而不是按顶点剪切它们。遍历所有顶点并存储 U 和 V 的最小值和最大值,然后为每个顶点缩放 UV,因此最小值变为 0,最大值变为 1。
我正在解析纹理坐标大于 1 且小于 0 的 OBJ。然后我通过使 UV 值在 [0,1] 范围内写回它。基于对 another question on SO 的理解,我正在按如下方式转换到范围 [0,1]。
if (oldU > 1.0) or (oldU < 0.0):
oldU = math.modf(oldU)[0] # Returns the floating part
if oldU < 0.0 :
oldU = 1 + oldU
if (oldV > 1.0) or (oldV < 0.0):
oldV = math.modf(oldV)[0] # Returns the floating part
if oldV < 0.0:
oldV = 1 + oldV
但是我在输出的 obj 文件和在某些软件中呈现的原始 obj 文件中看到一些锯齿状线条:
这可能不会像您预期的那样工作。
给定一些从 U=0.9
开始并在 U=1.1
结束的三角形边,然后在你的 UV 裁剪之后你将从 0.9
开始但在 0.1
结束所以三角形将使用纹理的不同部分。我相信这发生在你的网格底部。
一般来说,在 0-1 范围之外使用 UV 没有问题,所以首先尝试按原样渲染网格,看看是否有任何问题。
如果您真的想将 UV 移动到 0-1 范围,则缩放和移动 UV,而不是按顶点剪切它们。遍历所有顶点并存储 U 和 V 的最小值和最大值,然后为每个顶点缩放 UV,因此最小值变为 0,最大值变为 1。