2011-08-29 154 views
4

OpenGL ES 2.0沒有ES 1.0所做的GL_POINT_SMOOTH定義。這意味着代碼我用畫圓不再起作用:使用GL_POINT_SMOOTH的OpenGL ES 2.0等同於ES 1.0圈?

glEnable(GL_POINT_SMOOTH); 
glPointSize(radius*2); 
glDrawArrays(GL_POINTS,0,nPoints); 

是否有ES 2.0等效,或許還有在頂點着色器去,或者我必須使用多邊形每個圈?

+0

[OpenGL ES 2.0與iPhone:GL_POINT_SMOOTH繪製正方形與ES 2.0,但在ES 1.0中工作]的可能重複(http://stackoverflow.com/questions/7234379/opengl-es-2-0-with-iphone- gl-point-smooth-draws-squares-with-es-2-0-but-works-in) –

+0

@Kornel該問題的答案涉及OpenGL ES 1.0,而不是ES 2.0。 – KomodoDave

+0

還是不要問同樣的問題兩次。 –

回答

6

您可以使用點精靈來模擬這個。只需啓用點精靈並獲得一個特殊變量gl_PointCoord,您可以在片段着色器中讀取該變量。這給出了當前點平方中片段的座標。你可以用這些來讀取包含一個圓圈(像素不是圈有0顏色)的紋理,然後丟棄每一個片段,它的紋理值是0:

if(texture2d(circle, gl_PointCoord).r < 0.1) 
    discard; 

編輯:或者你也可以做它沒有紋理,通過交易質地訪問延遲的計算複雜性和公正評估圓式:

if(length(gl_PointCoord-vec2(0.5)) > 0.5) 
    discard; 

這可能是由丟棄的平方根(在length功能使用)和比較反對的平方半徑進一步優化:

vec2 pt = gl_PointCoord - vec2(0.5); 
if(pt.x*pt.x+pt.y*pt.y > 0.25) 
    discard; 

但是也許內建的length函數甚至比這更快,對長度計算進行了優化,並且可能直接在硬件中實現。

+0

甜蜜,再次感謝基督徒:)這是現在最後一個問題! – KomodoDave

0

答案是 - 是的,你必須使用多邊形(如紋理四邊形)來獲得平滑點。