簡體   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