2011-04-03 142 views
42

我知道我必須做的叫下列情況之一每次調用glVertex前:opengl紋理座標如何工作?

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

但我不知道他們的意思。然而,我知道如果我把右邊(或者是所有的邊)乘以(或者是這個分割?),我的紋理會擴展,如果我做的是相反的話,我的紋理會重複兩次。我設法通過應用操作來編寫紋理圖集,直到它工作。但我對發生了什麼事有正確的想法。爲什麼劃分這些影響圖像,爲什麼逆轉它們呢?紋理座標如何工作?

回答

95

紋理座標指定紋理圖像中與您指定的頂點相對應的點。想想一張印有紋理圖像的長方形橡膠板,其中每一邊的長度都標準化爲0-1範圍。現在讓我們假設你想用該紋理繪製一個三角形。你需要3個針腳,並將它們放置在每個所需紋理座標位置的橡膠片中。 (說[0,0],[1,0]和[1,1]),然後將這些引腳(無需取出)移動到所需的頂點座標(Say [0,0],[0.5,0]和[ 1,1]),以便橡膠片伸出並使圖像變形。這基本上是紋理座標的工作原理。

如果您使用的紋理座標大於1,並且您的紋理設置爲重複,那麼就好像橡膠片的大小無限大,紋理平鋪在整個紋理上。因此,如果兩個頂點的紋理座標分別爲0,0和4,0,則圖像必須在這些頂點之間重複4次。

enter image description here @ b1nary.atr0phy圖像適合所有你的視覺思考者!

+4

引腳類比是偉大的。我正在考慮在四邊形上拉伸和移動紋理,而不是使用紋理座標從紋理中「取樣」。謝謝。 – 2011-04-04 03:47:08

+17

[Image for all you visual ideas](http://i.stack.imgur.com/l8Ohw.png) – 2014-08-24 05:36:36

+0

我可能是錯的,但是對於webgl紋理的原點位於左上角而不是左下角。我相信所有的gls都是一樣的。這張照片造成了混亂。 – 0xcaff 2016-06-07 03:27:42

8

OpenGL使用逆紋理。它從世界空間(X,Y,Z)到紋理空間(X,Y)到離散空間(U,V)的座標,離散空間位於[0,1]域。

拿一個多邊形,把它想象成一張紙。有了這個:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

你告訴OpenGL在整張紙上繪圖。當您應用修改時,紋理空間相應地修改爲給定座標。這就是爲什麼舉例來說,當你分裂你得到相同的紋理兩次,你告訴OpenGL來繪製你的表的一半,而不是整張紙。

6

紅皮書第9章對此進行了詳細解釋,並且可以在網上免費下載。

http://www.glprogramming.com/red/chapter09.html

紋理座標圖的x,y,以在寬度和高度紋理空間的空間0-1。然後在三角形上像橡膠片一樣拉伸。最好用圖片來解釋,紅皮書是這樣做的。

3

對於2D圖像紋理,紋理座標中的0,0對應於圖像的左下角,紋理座標中的1,1對應於圖像的右上角。請注意,「圖像的左下角」不在左下角像素的中心,而是在像素的邊緣。

也很有趣,當上傳圖片:

8.5。3紋理圖像結構

紋理圖像本身(由數據引用)是一組值的序列。第一組是紋理圖像的左下角。後續組從左到右填充寬度寬度的行;高度行從底部到頂部堆疊形成單個二維圖像切片;並且深度切片從後向前堆疊。

請注意,大多數圖像格式的數據起始位於頂部,而不是底部行。