2011-09-01 126 views
5

如何讓我的紋理與OpenGL ES 2.0中的像素完美圖形的屏幕像素一致?這對於我正在使用像素藝術圖形的項目至關重要。任何幫助都會很棒!iPhone OpenGL ES 2.0 - 像素完美紋理

+1

還有一件事......確保你在着色器的頂部有'precision highp float;'。如果您的紋理大於1024x1024,則中性不會爲您提供足夠的精度來對紋理中的每個像素進行採樣。 –

回答

9

見我的答案在這裏:OpenGL Texture Coordinates in Pixel Space


這已經被問了幾次,但我沒有手頭上的鏈接,這樣一個快速和粗糙的解釋。比方說,質地爲8個像素寬:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
^ ^^^^^^^^
0.0 | | | | | | | 1.0 
| | | | | | | | | 
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8 

中的數字表示紋理的像素,酒吧紋理過濾的像素之間的邊界的邊緣,在最近的情況。然而,你想要擊中像素的中心。所以,你感興趣的紋理座標

(0/8 + 1/8)/ 2 = 1 /(2 * 8)

(1/8 + 2/8)/ 2 = 3/(2 * 8)

...

(7/8 + 8/8)/ 2 = 15 /(2 * 8)

或更一般地用於像素i的正寬紋理適當的紋理座標是

(2i + 1)/(2N)

但是,如果您想將您的紋理與屏幕像素完美對齊,請記住,您指定的座標不是四邊形的像素,而是邊緣,根據投影可能與屏幕像素邊緣對齊而不是中心,因此可能會需要其他紋理座標。

+0

謝謝!這有幫助。 – Marc

+1

我不同意 - 沒有理由做任何特別的事情。 GL確保變化的樣本總是在像素內部的某個位置(通常是中心)進行計算,所以不需要做任何特殊的事情。只需將紋理繪製爲四邊形,使用GL_NEAREST進行紋理過濾,並使用(0,0,1,1)作爲紋理座標。只要紋理與屏幕空間中的四邊形大小相同,紋理繪製就會像素完美。 –

1

此鏈接可能是有用的:

http://glprogramming.com/red/appendixg.html#name1

看「如果精確的二維光柵化需要......」。這個OpenGl小技巧告訴你如何最好地爲2D設置你的矩陣。

此外,您可能需要禁用任何類型的紋理過濾。

+0

這是對傳統OpenGL的好建議,但不直接適用於ES 2.0 – andrewmu

+0

@andrewmu:不知道 - 你能解釋爲什麼嗎? ES如此不同? – neodelphi

+0

非常感謝,但是正如ardrewmu所說的,這樣的矩陣操作在ES 2.0中不可用。雖然我之前看過這個,但它可能有幫助。 – Marc