OpenGL:ただの図形を美しく見せるアンチエイリアス処理の一覧

アンチエイリアシングって何?というかたはこちらのページをアンチエイリアシング

線へのアンチエイリアス

glEnable(GL_LINE_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
    .......線を描く
    glDisable(GL_BLEND);
    glDisable(GL_LINE_SMOOTH);

ポリゴンへのアンチエイリアス

何もせずにポリゴンを描いたら、左の図のようににギザギザになります。

アンチエイリアスなし アンチエイリアスあり
dither.png antialiased.png
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POLYGON_SMOOTH);

をすると、ギザギザがだいぶマシに!
拡大するとこのように
zoomup.png
右は背景の色とブレンディングされているのがわかりますね
しかし、これには罠があります。
沢山のポリゴンを描くと、間に隙間があいてしまうのです!
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);//陰面消去しておくとより顕著にわかりやすく見えるのでEnableにした
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//back-to-front
glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);    
glColor4ub(153,204,0,255);
glutSolidSphere(1.0,20,20);

polygon_smooth.PNG
GL_POLYGON_SMOOTHはこの致命的な欠点があるから、使えないや。
GL_MULTISAMPLE ならポリゴンが隣り合ってても問題なし!

glHintとは

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);

こういう部分がありましたね。
これはなんでしょう?
画質と処理速度のトレードオフを調整するものです
GL_NICEST
処理速度よりも画質優先
GL_FASTEST
画質よりも処理速度優先
GL_DONT_CASE
マシンにおまかせ

第一引数には

  • GL_LINE_SMOOTH_HINT
  • GL_POINT_SMOOTH_HINT
  • GL_POLYGON_SMOOTH_HINT

などが入れられる。

色々なアンチエイリアシング手法

サポートサイト Wikidot.com