2011-02-08 150 views
4

我有以下代碼:如何擺脫Android OpenGL ES中的鋸齒邊緣?

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST); 
} 

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 

但還是邊緣都在Android模擬器嚴重鋸齒狀。解決辦法是什麼?

回答

4

那麼最好的方法是使用多重採樣(抗鋸齒)。由於您使用模擬器,因此這不適合您。 (OpenGL ES 2.0支持Multismapling,但仿真器不支持2.0) 根據OpenGL規範,設備可以忽略您設置的glHint,所以不要期望太高。 GL_DITHER是一種從16位顏色深度'僞'24位顏色深度的方法,基本上它與邊緣無關。

雖然有一種'假'抗鋸齒的舊方法,它與我從未使用過的相同,所以我不能告訴你如何,但是你可以在網上找到一些提示。

OpenGL docs

混合函數(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)也是爲了在任意的順序渲染抗鋸齒點和線是有用的。

使用混合函數(GL_SRC_ALPHA_SATURATE,GL_ONE)和從最近到最遠排序的多邊形優化了多邊形抗鋸齒。

+0

爲了記錄,萬一有人遇到這種情況:AVD現在支持OpenGL ES 2。0通過hopst GPU部署(可選,注意複選框)。 – 2013-04-11 11:38:47

1

您正在使用「提示」開啓多邊形平滑。提示僅僅是你想讓多邊形邊平滑的實現的「暗示」。如果需要,實現可以自由地忽略它。

這正是它正在做的。

此外,您很可能無法在Android設備上打開消除鋸齒功能,因爲它們的強度不夠。手機可能會有所不同,但同樣,您正在設置提示。

+0

好吧,有沒有其他解決方法鋸齒狀的邊緣,而不是通過API提示?我不知道仿真器是否支持抗鋸齒。有經驗的Android開發人員能證實這一點嗎我正在使用API​​級別8構建目標2.2。 – ace 2011-02-08 14:57:00

+1

@Alan:你總是可以通過渲染緩衝區兩倍的寬度(或高或兩者)來僞造消除鋸齒,然後渲染到雙線性背景以獲得消除鋸齒效果,但我並不知道轉向方式Android上的反鋸齒... – Goz 2011-02-08 16:01:38

+0

我仍然忙於處理OpenGl中的其他問題,一旦我測試了這裏描述的建議,就會回寫。 – ace 2011-02-11 09:17:06

0
  1. 嘗試使用設備。我不相信模擬器的視覺/圖形相關問題。
  2. 嘗試gl.glEnable(GL10.GL_DITHER);。我不確定這是否默認啓用。另外:這會使繪圖變慢。
+1

-1。抖動與鋸齒邊緣無關,但在幀緩衝區使用低位深度(每像素16位等)時減少條帶。 – 2013-04-03 10:24:27

1

我剛剛經歷了和你一樣的問題。我認爲你要找的是以下代碼行:

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);