繁体   English   中英

C ++ DirectX-纹理化2D网格

[英]C++ DirectX - texturing a 2D mesh

在DirectX中,我一直在使用以下结构处理纹理四边形:

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

但是我想制作更复杂的2D网格并对其进行纹理化,但是我不知道如何在其上对齐纹理。 在带纹理的四边形中,结构的u和v属性确定纹理的方向。

理想情况下,我最终想要做的是要么在其上具有纹理的2D网格物体,要么将需要新的结构属性,并对其进行拉伸/操纵以使其完全适合网格物体,无论它最终看起来如何变形。

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

我尝试了谷歌搜索,但只能找到与3D图形有关的内容。 虽然我意识到自己在3D空间中进行技术工作,但最终要做的是创建2D图形。 我将不胜感激地提供任何答案,从可能实现的建议到寻找/开始的建议,直至可能的示例。

您应该真正了解纹理坐标如何工作。

让我们考虑以下网格。 我们要应用不变形的纹理(虚线矩形):

样品

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM