2011-01-26 30 views
1

看看下面的圖片 - 你會看到在後臺的雲有一個很煩人的線縫:不能在OpenGL擺脫質地包裹縫

http://simoneschbach.com/seam.png

這縫發生時,包左右出現,因爲我提供的質感編程用下面的代碼座標:質地初始化期間

gBackgroundPos += 0.0003f; // gBackgroundPos climbs indefinitely... 
GLfloat bgCoords[] = { gBackgroundPos, 1.0, 
      gBackgroundPos + 0.5f, 1.0, 
      gBackgroundPos, 0.0, 
      gBackgroundPos + 0.5f, 0.0 }; 

我已經啓用紋理包裹如下:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

有沒有人知道我可以在這裏做什麼擺脫非常明顯的接縫?

+1

確定源圖像不包含任何白線? –

+0

接縫標籤用於JBoss接縫。我已經刪除它 –

回答

1

這只是一個猜測,它可能無法正常工作。您是否嘗試過在GL_LINEAR和GL_NEAREST之間更改GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?另外,你有沒有啓用mipmap(例如通過使用gluBuild2DMipmaps)?如果有,請嘗試禁用它們。

0

您可能可以利用紋理邊界(2^m + 1 x 2^n + 1紋理,而不是2^mx 2^n)並將數據從對面複製到邊界像素中以製作紋理循環。

您還需要更改GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER以使用線性插值或更好(可能是GL_LINEAR_MIPMAP_LINEAR以獲得最佳結果)。

2

如果那個評論是一個答案,我會爲Shezan Baig投票。

GL_REPEAT旨在完成您想要的功能。如果不是這樣,很可能是因爲你的紋理本身有接縫,或者加載紋理的工具鏈引入了接縫(比如說,因爲源紋理不是兩個尺寸的冪)。

3

這是一個老問題,但我最近不得不面對同樣的問題。

當紋理環繞一個圓柱體時,會在地圖邊緣相交處出現自然接縫。

穿過該邊界的三角形條紋捲起,紋理座標使渲染器將整個紋理向後擠壓到這些三角形中。

只看U座標:不穿過紋理邊緣的三角形將具有其逆時針順序的紋理座標。但是,當一個三角形穿過邊界時(例如),會以相反的繞線順序卷繞,因爲穿過邊界的點被映射回紋理的另一側。您通常會看到一個三角形,它在0.9-0.9999 U範圍內有一個或兩個紋理座標,其餘座標在0-0.1範圍內。

當渲染器看到它時,它完全按照它的設想:它將人臉紋理座標從0.9降至0.1,其中包括大部分紋理。當縫隙向後擠壓到一個狹小的空間時,縫隙就是紋理的樣子。

解決的辦法是分割跨越邊界的頂點,以便每個受影響的頂點在列表中出現兩次。第一個紋理座標位於地圖左端,另一個紋理座標位於另一端,因此沒有單個邊緣跨越紋理。

請注意,您並未更改頂點的XYZ值:只是UV。

另外請注意,這不會發生在不同邊之間不共享頂點的曲面。飛機是免疫的。您的示例圖像不再在線,因此我無法驗證這是發生在您身上的事情,但似乎可能基於您的粗略描述。

4

你的問題是,正是通過這種技術,這是實現非常簡單的解決:

http://vcg.isti.cnr.it/~tarini/no-seams/

有那個鏈接,公開使用的片段着色器的開源演示。

的技巧是很容易,即使沒有的,爲什麼它的工作原理完全理解採用,但它是在北京印刷的工具條充分說明: 「圓柱和環形參數化沒有頂點的接縫」 可以發現,對於例如,在 http://vcg.isti.cnr.it/Publications/2012/Tar12/

不幸的是,這裏列出的其它解決方案將無法正常工作:

  • GL_REPEAT(如GL_TEXTURE_WRAP),獨自一人,不你所需要的。正如所指出的那樣,問題是S = 0.9和S = 0.1的三角形連接點一直貫穿圓柱體,而不是穿過接縫向前。

  • 在「剪切」(紋理接縫)上覆制頂點可用於靜態幾何,其中紋理座標作爲屬性發送(但即使如此,缺點仍然很多:引入複製和接縫破壞幾何:紋理切割的兩側將在拓撲學上斷開連接)。在這種情況下,特定情況下,紋理座標在程序上產生,所以這甚至不是一個選項。