2011-02-18 58 views
2

enter image description here我使用OpenGL ES在iPad上遇到了傳統的tile/mipmap問題。基本上,如果你有一個很大的紋理(大於1k X 1k),你可以將它分解成幾塊並將它們映射到單獨的多邊形上。你可以將紋理座標限制在邊緣,它大部分都可以工作,但是你會得到沿邊界的僞像。OpenGL ES平鋪紋理Mipmap問題 - iPad/iPhone

現在我知道你爲什麼這樣做,並知道傳統解決方案是什麼。換句話說,你在每個littler紋理的外部(比如說6個像素)做一個邊框。你從小紋理中抽取樣本到大樣本中,所以你只需要使用那些像素(比如256-2 * 6)。然後,將有效像素拖到邊框區域。最後,你映射你的紋理座標,只使用那些有效的內部像素。沒問題。

如果你現在還沒有點頭,不要試圖回答。 :-)

不管怎麼說,OpenGL在當天解決這個問題時引入了鉗位模式。我沒有在OpenGL ES中看到這些模式(至少在這個硬件上),並且我看到了對這個問題的其他引用。我想知道的是如果我錯過了什麼。有沒有更新的方法來解決我不知道的瓷磚/邊緣問題?

[更新] 結果的截圖附在此處。可見線位於一個紋理的末尾,另一個紋理的起始位置。這是使用CLAMP_TO_EDGE。

回答

3

GLES提供GL_CLAMP_TO_EDGE,但不提供GL_CLAMP,它夾在紋理中最外面像素的中心而不是邊緣。因此,使用CLAMP_TO_EDGE可以完全防止出界(邊界或環繞)訪問,但CLAMP不會。

CLAMP_TO_EDGE是GL ES規範的一部分(根據here for 1.1here for 2.0),所以如果您的硬件不支持它,那麼它在技術上不符合GL ES標準。它也可以在完整的Open GL中使用,但我認爲只有版本1.2。這意味着CLAMP_TO_EDGE向ES邁進了一步,但CLAMP並沒有因爲前者被認爲是後者的固定版本。

這聽起來像CLAMP_TO_EDGE應該適合你在做什麼 - 我誤解了嗎?

+0

事實上,CLAMP_TO_EDGE應該做到這一點。它在OpenGL 1.2中做過,如果我還記得那麼久。雖然似乎不在這裏。這很好奇。 – mousebird 2011-02-18 18:56:37

0

最後問題與紋理壓縮有關。這些線條是由於假定紋理環繞的壓縮方法造成的。

我解決了這個問題,通過構建比需要更大的紋理,壓縮,然後只使用每個紋理內的區域,從而留下邊界。