2013-06-24 14 views
11

私はhow to draw round pointsを知っています。固定パイプラインを使用しています。しかし、私は現代のOpenGLを使って同じことをする必要があります。それは可能ですか、ポイントスプライトとテクスチャを使用する必要がありますか? interested.Hereについては最新のOpenGLを使用して円を描く

は、それが固定されたパイプラインで行われている方法です。

 glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_NOTEQUAL, 0); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SMOOTH); 
    glPointSize(8.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(myMatrix); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(myAnotherMatrix); 

    glBegin(GL_POINTS); 
    glColor3f(1,1,1); 

    glVertex3fv(position); 


    glEnd(); 
    glDisable(GL_POINT_SMOOTH); 
    glBlendFunc(GL_NONE, GL_NONE); 
    glDisable(GL_BLEND); 
+0

あなたがいない場合は、しかし、固定パイプラインを使用して、ラウンドのポイントを描きましたかポイントスプライトとテクスチャを使用しますか?あなたは 'GL_POINT_SMOOTH'と一緒に' glPointSize'を使いますか?私はこれまで信頼できる方法ではなかったと思います。 –

+0

ハックがあります;)アップデートを参照してください。 –

答えて

7
+0

実際には、シェーダでvodooを実行しなくても可能かどうかを尋ねました。しかし、リンクの場合は+1です。 –

+4

シェーダで*何も*しないと、現代のOpenGLで何もできません。むしろ 'GL_POINT_SMOOTH'ブードゥーの奇妙な振る舞いを呼びたいと思います。 –

+0

"シェイダーのブードー" - あなたはそれについて考えるべきではなく、サークルを描くことに関してだけでなく、より良いプログラムを得る、これはここからそれを行う方法です。固定機能は*従来の* –

7

一つの方法は、フラグメントシェーダの円テクスチャと自作のアルファテストでポイントスプライトを描画するだろうこれは、円がかなり明確な数学的概念であるためです。だから全体のポイントをあなたの現在のフラグメントを表す[0,1]角の部分がある、と言うだけgl_PointCoord、チェック:

vec2 coord = gl_PointCoord - vec2(0.5); //from [0,1] to [-0.5,0.5] 
if(length(coord) > 0.5)     //outside of circle radius? 
    discard; 
+0

なぜ自己作成のアルファテストが必要ですか?テクスチャにアルファハードウェアのアルファブレンディングで十分です。それじゃない? –

+0

@MichaelIVしかし、アルファテストは廃止され、コアプロファイルの一部ではなくなりました。おそらくアルファブレンディングで十分ですが、可能であればアルファテストが優先されます。なぜなら、「見えない」フラグメントで深度バッファを汚染しないからです(早期に破棄されるため、わずかに高速かもしれません)。そして、言ったように、テクスチャのない方法はとにかく良いでしょう。 –

+0

@MichaelIV多くの不透明で丸い粒子を描きたいと思っているとしましょう。アルファブレンディングの代わりにアルファテストを使用する場合、パーティクルを深度ソートする必要はありません。とにかくパーティクルが透明であれば、それらをソートしてアルファブレンディングを使用する必要があるので、実際には 'discard'からの機能改善はありません。 –