gpt4 book ai didi

C++ DirectX - 对 2D 网格进行纹理化

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:11 25 4
gpt4 key购买 nike

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

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

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

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

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

我试过谷歌搜索,但只能找到与 3D 图形相关的内容。虽然我意识到我在 3D 空间技术上工作,但我最终想做的是创建 2D 图形。如果可能的话,从建议从哪里开始实现这一目标到完成示例,我将不胜感激。

最佳答案

您真的应该阅读纹理坐标的工作原理。

让我们考虑以下网格。我们想要应用未失真的纹理(虚线矩形):

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

关于C++ DirectX - 对 2D 网格进行纹理化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16468927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com