2013-05-09 82 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