你应该真的了解纹理坐标的工作方式。
让我们考虑下面的网格。我们想申请未失真的纹理(虚线矩形):

然后指定纹理坐标为每个顶点是非常简单的:
u = (x - minX)/(maxX - minX)
v = (y - minY)/(maxY - minY)
如果你想旋转纹理,你必须在相应的轴上投影顶点。
如果你想扭曲纹理,你必须指定纹理边缘的纹理坐标。可以使用的一个简单的算法是以下各项之一:
Choose an arbitrary point in the polygon -> o
For each vertex v
Shoot a ray from o through v
Find the intersection of this ray with minX/maxX/minY/maxY
Calculate the texture coordinates at the intersection points as above
Next
然而,这种算法不能保证每一个纹理像素被映射到网格。例如。上述示例的右上角未映射到上述算法的任何内容。此外,它只能保证凸多边形的一致映射。
这里是一个凹多边形的算法。它应该产生一致的坐标。但是,我不知道结果如何。该算法也可以跳过角点。可以包括将角点的坐标应用到特定顶点的检查(例如,当一边发生变化时):
Calculate the polygon's perimeter -> p
//The texture coodinate space has a perimeter of 4
currentPos := 0
for each vertex
if(4 * currentPos < 1)
uv = (4 * currentPos/p, 0) // top edge
else if(4 * currentPos < 2)
uv = (1, 4 * currentPos/p - 1); //right edge
else if(4 * currentPos < 3)
uv = (1 - 4 * currentPos/p - 2, 1); //bottomedge
else
uv = (0, 1 - 4 * currentPos/p - 3); //leftedge
currentPos += distance to next vertex
next
你的问题有点含糊地诚实。如果您有一个顶点,您可以根据需要在网格中包含尽可能多的顶点/三角形。通常情况下,模型/地图/对象导出器会列出您读取的文件格式中的uv的位置。 – 2013-05-09 18:50:37
是的,但我有一个带有四个顶点的纹理四边形。问题是有四个以上。 u和v属性确定四边形纹理的方向,但是如果有超过4个顶点,我该如何实现?或者你是否说u和v属性可以应用于纹理四边形之外的其他东西?如果是这样,我将如何在这种情况下使用它们? – Interminable 2013-05-09 20:11:09