UV纹理坐标(WebGL)

我正在用WebGL创建3D游戏,并将Wavefront对象用作基本模型格式。 我最近发现一些模型,其纹理坐标超出了典型的[0,1]范围,我真的不知道如何处理它们(在代码中)。

我当然知道这是一个已知的问题,纹理坐标可以在[0,1]之外,解决scheme是使用GL_REPEAT包装模式。

但是这对我来说并不是解决scheme,因为我有很多非二维纹理,我需要使用CLAMP_TO_EDGE wrap模式(对非pow-2纹理的解决scheme)。

我试图通过编码来绕过这个问题,所以把[0-,1 +]范围转换成[0,1],但是没有太多的成功(虽然有点)。 这是我做的:我打开“vt”条目(从我的parsing器),我检查的情况是这些(伪):

U,V = texture coordinates as they come from file if (U<0) { U = U + Math.abs( Math.floor(U) ); } if (U>1) { U = U - Math.floor(U); } if (V>=0) { V = Math.ceil(V) - V; } if (V<0) { V = Math.abs( Math.floor(V) - V ); } 

上面的片段将取一个未知范围的U,V,并将其转换为[0,1] ,同样关注WebGL纹理协调系统 (对于WebGL而言, 0,0左alignment,对于Wavefront则为0,1 ,第三种情况以上)

数字计算正确,但结果不是预期的,恐怕在我的身边有一个关于GL_REPEAT模式如何工作的误解。

所以我的问题

  • 这可以通过代码解决,所以我可以使用CLAMP_TO_EDGE
  • 如果没有办法,是否有任何程序,可以采取重复模型的坐标,并在[0,1]范围内产生一个? 我已经在使用Blender,但在出口商找不到这个设置。

我认为你最好把你的纹理重新调整到最接近的2次方。 您不需要调整纹理坐标,因为它们相对于纹理图像的大小(尽管您可能需要设置v = 1 – v来说明不同的起点)。

自定义包装纹理坐标的问题是,过滤在“值”从1→0突然变化的“接缝”处无法正常工作。