2012-09-11 28 views
6

根據定義,GL_TEXTURE_MIN_FILTER用於紋理像素映射到大於一個紋理元素的區域。什麼時候應該設置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?

說我有一個1024 * 768分辨率的紋理,我想將它映射到一個矩形。投影矩陣是使用設置:

glOrtho(0, 1024, 0, 768, 0, 1); 

和矩形被設定爲:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(1024.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(1024.0f, 768.0f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 768.0f, 0.0f); 

在當前的配置,我的理解是在矩形的每個像素被映射到一個單個像素的紋理。

經過測試,我發現MIN_FILTER正在爲此配置工作。即使將矩形的大小加倍(即2048 * 1536),只有左下角顯示在視口中,它仍然是正在運行的MIN_FILTER。

在這種情況下,我個人的理解是,視口中的每個像素映射到紋理中只有四分之一像素,爲什麼它仍然是MIN_FILTER工作?

爲了測試哪個過濾器正在工作,我只是註釋掉設置該過濾器的行並查看結果是否錯誤。如果我將MIN_FILTER設置行註釋掉,結果將會是全黃色,因爲我沒有將紋理的最大級別設置爲與其級別相符。但是,如果我註釋掉MAG_FILTER行,結果仍然正確。

+4

你所說的「工作」和「不工作」是什麼意思? –

+1

如果你的情況視小於1024×768,那麼你會有效地做一個微小。 – datenwolf

回答

11

據我所知,你註釋掉GL_TEXTURE_MIN_FILTER的設置,紋理不再起作用。由此可以得出結論,在紋理化過程中使用最小過濾器。而這種行爲恰恰是錯誤的。

不設置最小過濾器時,它不會神奇不工作。相反,默認的GL_NEAREST_MIPMAP_LINEAR被使用,並且因爲你沒有爲其他mipmap圖層指定紋理圖像,所以它不起作用(因爲你以某種方式猜出你自己,我想)。但是,如果最小濾波器實際用於某個像素,結果並不是錯誤的。由於紋理是不完整的(即使用mipmapping,而對於每個mipmap級別不具有有效圖像),所以紋理將無法工作。所以它也不適用於磁鐵過濾。不是過濾器被破壞,而是整個質地。

另一方面,GL_TEXTURE_MAG_FILTER沒有mipmapping模式,並且當您不設置它時,它使用默認值GL_LINEAR。因此,無論您是否設置了mag-filter,紋理總是完整且可用。

因此,檢查某個過濾器是否被使用的方法是垃圾,並且您的實現可能完全符合您理論上的想法。

因此得出結論:

  1. 你並不需要設置分鐘和MAG過濾器的紋理對象。如果你不這樣做,他們將使用默認值。但默認情況下,最小過濾器使用mipmapping,並要求您爲每個mipmap級別指定圖像,否則不管紋理是不完整的(即無法工作),無論哪個過濾器用於特定片段。

  2. 這是一個好主意,始終明確設置過濾器模式的每個紋理對象不依賴於你可能不肯定的任何默認值。

  3. 當一個像素的尺寸究竟(什麼是「恰好」在這個CONTEX反正?)紋理像素的尺寸相匹配,這是很難說哪兩種過濾模式中使用,但不容易檢查哪一個用於特定片段的方法。但是,如果你需要完美像素紋理反正(像剛剛繪製位圖2D屏幕),然後使用GL_NEAREST兩個分和MAG過濾器可能是最好的主意,並釋放你想哪個過濾器實際使用,反正。

相關問題