2015-09-04 77 views
2

我知道這可以通過對給定的紋理使用GL_REPEAT並將紋理座標適當地映射到頂點上來輕鬆實現。我想知道如果可以做同樣的不是爲了整個紋理,而是從它裁剪出來的圖像?唯一的辦法似乎是以編程方式創建一個單獨的紋理來適應圖像,然後使用它...有沒有更好的解決方案?如何使用從紋理裁剪的可重複圖像填充多邊形?

+0

除非我誤解了這個問題,這不就是操縱uv座標的問題嗎?縮放uv範圍以匹配裁剪的寬度和高度,然後添加裁剪矩形相對於紋理的uv原點的正確偏移量。在着色器中,您可以根據fragCoord選擇/放棄要渲​​染的像素,並且如果希望最終結果包含邊框,也可以在那裏進行更多邊框匹配。 – StarShine

+0

嗯我猜這是行不通的。以一個大矩形爲例,包含4個頂點的1024x600像素。假設我想用圖像32x32px填充它。如果從紋理中裁剪出這樣的圖像,則目標矩形的4個頂點不足以正確映射紋理座標以均勻地填充整個矩形。如果紋理完整,可以考慮沒有額外的偏移量......這就是我至少想到的。 – Savail

回答

3

比方說,你大源紋理的尺寸爲TX,泰

比方說,你複種面積尺寸爲TX,TY與偏移牛,OY。 (在你的情況下,TX,TY是32×32)

假設目標四有UV空間[0..1,0..1](在你的情況下,四是1024x600的單位尺寸)

  • 首先,您需要在片段着色器中計算實際片段的(u,v)。這些值將位於目標四邊形的UV空間中。

    (SU,SV)=(U,V)

  • 乘以四邊形的尺寸(轉化此爲像素單位)

    (SU,SV)=(U,V)* (1024,600)

  • 這將用於從所述裁剪區域來樣,所以截斷到作物區域尺寸的第一和偏移裁剪窗口源紋理位置

    (SU,SV)= ((u,v)*(1024,600))%(32,32)+(ox,oy)

  • 把它放回用於採樣源位置座標的四,同樣在[0..1,0..1]

    (SU,SV)=(((U,V)* (1024,600))%(32,32)+(OX,OY))/(TX,泰)

所以,現在當你寫,你可以用它來發現在一個像素着色器GLSL裁剪後的窗口與您想要的窗口匹配,用於每個片段。截斷操作'%'將使片段(u,v)對於每個片段上升到1,並且一次又一次地重複。

color = texture(sampler, (su,sv)) 
+0

好吧現在我完全理解你的方法。我還沒有嘗試過,但看起來很有希望。是否有可能爲任何多邊形擴展這種方法?不只是一個矩形四邊形? – Savail

+0

我想通了!只是一個uv操縱的問題。非常感謝! – Savail

+0

我最終在片段着色器中使用了這樣一行代碼(僞代碼),從我的紋理圖集uv中計算出合適的UV座標。xy =(vertex_position.xy%image_size.xy + image_offset.xy)/ tex_size.xy;然而,不管我做什麼,這都會在瓦片之間引入空間。我嘗試將圖像大小擴大1 px或縮小圖像以僅採用不受混合影響的區域,但問題仍然存在。我想它與浮點精度有關,所以你認爲它可以以某種方式修復?在GL_REPEAT中使用整個紋理填充多邊形時,不存在這樣的問題 – Savail