谁说UV只能<1

先说结论:UV在实际应用中并不一定小于1,OpenGl对texture进行采样的时候,专门有一个参数来控制对UV坐标大于1的部分如何处理——详见这个链接的wrapping部分。

也就是说,对于obj文件:

v  -44.036751 0.000000 47.681671
v  42.139252 0.000000 47.681671
v  -44.036751 0.000000 -38.494034
v  42.139252 0.000000 -38.494034
# 4 vertices

vt  0.0 0.0 0
vt  2.0 0.0 0
vt  0.0 2.0 0
vt  2.0 2.0 0
# 4 texture vertices

vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
vn  0.000000 1.000000 -0.000000
# 4 vertex normals

g Plane01
s 1
f 3/3/3 1/1/1 2/2/2 4/4/4

g

如果用GL_REPEAT来对材质采样并渲染模型,会得到一个垂直于Y轴的平面(四个v坐标很容看出来),且对应材质会均匀的平铺四次(vt刚好是(0,1)的两倍),如下图:

2x2

对应在u3d中,只要把texture的wrap mode设为repeat就行(还有一个选项是clamp,实际对应的是GL_CLAMP_TO_EDGE)。

事实证明,0 < UV < 1这个定义永远成立只是我一厢情愿的想法罢了,在实际应用当中,UV > 1恰恰是个解决repeat问题的最佳方案。不过这个方案还是存在缺陷的——需要repeated的材质无法跟其他材质一起打成atlas了。

又涨姿势了。