在DirectX中,我一直使用以下结构处理纹理四边形:
struct TLVERTEX
{
float x;
float y;
float z;
D3DCOLOR colour;
float u;
float v;
};
但是我想制作更复杂的2D网格并对其进行纹理处理,但我不知道如何在其上对齐纹理。在纹理四边形中,结构的u和v属性决定了纹理的方向。
理想情况下,我想要最终能够做到的是要有一个带有纹理的2D网格或者我需要的新结构属性,纹理被拉伸/操纵以完全适合网格,无论它有多么扭曲最终可能看起来。
我想做的另一件事就是说有一个2D网格,上面贴有纹理,没有纹理拉伸等等。我只是想对齐它,所以如果纹理不适合网格的形状,位将丢失等。
我尝试过谷歌搜索,但只能找到与3D图形相关的东西。虽然我意识到我在技术上是在3D空间工作,但我最终要做的是创建2D图形。我希望得到答案,从建议到达/开始实现这一目标,再到完整的例子,如果可能的话。
答案 0 :(得分:1)
你应该真正了解纹理坐标是如何工作的。
让我们考虑以下网格。我们想要应用未失真的纹理(虚线矩形):
然后指定每个顶点的纹理坐标非常简单:
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