2013-05-09 114 views
1

在DirectX中我一直在用下面的结构纹理四边形工作:C++的DirectX - 纹理二维网状

struct TLVERTEX 
{ 
    float x; 
    float y; 
    float z; 
    D3DCOLOR colour; 
    float u; 
    float v; 
}; 

不过,我想多复杂的二维网格和纹理的,但我不知道我如何对齐它上面的纹理。在纹理四边形中,结构的u和v属性决定纹理的方向。

理想情况下,我想要最终能够做的是要么有一个2D网格纹理,或者我需要什么新的结构属性,纹理拉伸/操纵完全适合网格,无论多么扭曲它可能最终看起来。

我想要做的另一件事是说有一个2D网格,纹理拍到它,没有纹理的拉伸等。我只想对齐它,所以如果纹理没有适合网格的形状,位会丢失等。

我试过Google搜索,但只能找到有关3D图形的东西。虽然我意识到我在技术上在3D空间中工作,但我最终要做的是创建2D图形。如果可能的话,我会很感激来自任何建议的答案,从哪里可以看到/开始实现这一点。

+0

你的问题有点含糊地诚实。如果您有一个顶点,您可以根据需要在网格中包含尽可能多的顶点/三角形。通常情况下,模型/地图/对象导出器会列出您读取的文件格式中的uv的位置。 – 2013-05-09 18:50:37

+0

是的,但我有一个带有四个顶点的纹理四边形。问题是有四个以上。 u和v属性确定四边形纹理的方向,但是如果有超过4个顶点,我该如何实现?或者你是否说u和v属性可以应用于纹理四边形之外的其他东西?如果是这样,我将如何在这种情况下使用它们? – Interminable 2013-05-09 20:11:09

回答

1

你应该真的了解纹理坐标的工作方式。

让我们考虑下面的网格。我们想申请未失真的纹理(虚线矩形):

Sample

然后指定纹理坐标为每个顶点是非常简单的:

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 
+0

这是有趣的和有益的,谢谢!我一直在做一些搜索,试图找到很好的阅读材料,但没有取得太大的成功。你有什么建议吗?另外你如何处理凹面问题?你是否必须根据对凹顶点的检查来分解它,以便最终得到一堆凸形状?或者我认为这是错误的方式? – Interminable 2013-05-11 10:29:07

+0

MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/bb206245(v=vs.85).aspx)是一个好的开始。为了处理凹多边形,不同的方法是必要的。我为此添加了一个示例算法。 – 2013-05-11 11:08:49

+0

将此标记为答案,因为您似乎已将我置于正确的轨道上。谢谢! – Interminable 2013-05-16 23:37:29