マルチサンプリング

multisample.png

概要

マルチサンプリングとは、ポリゴンの端っこのギザギザをスムーズにするために、
ただの幾何形状に追加の

  • デプス
  • ステンシル

の情報を追加してどうにかしようというテクニックである。
GL_POLYGON_SMOOTHでやってたアンチエイリアスの方法はアルファ値を使うだけ。
でも今度はちょっと違うらしい。
ポリゴンのz値によるソートは必要じゃない。
隣り合うポリゴンのせいで網網になることもない!
しかも、たった3つのステップを踏むだけで使えるんだって!
just follow these steps
dick in the boxの歌詞を思い出すな。

仕組み

実際の表示面よりも多くのピクセルを持つフレームバッファに、
たとえば4倍の大きさのフレームバッファに一回レンダリングする。
最終的な画像が作られる時に、これらのサンプルピクセルは、元の大きさ1/4のピクセルのための色に変換される。

欠点

4倍のレンダリング時間がかかるということ

1.初期化~マルチサンプリングを使う準備~

glfwOpenWindowHint(GLFW_FSAA_SAMPLES,4);//glfwOpenWindowの前に呼ばないと効果がない!
glfwOpenWindow( 0,0, 0,0,0,0,0,0, GLFW_WINDOW );

2.マルチサンプリングが使用可能か確かめる

別にしなくてもいい。でも、あれ、マルチサンプリング効いてない、おかしい!って思ったときは確かめたほうがいい。

GLint bufs,samples;
glGetIntegerv(GL_SAMPLE_BUFFERS,&bufs);
glGetIntegerv(GL_SAMPLES,&samples);

3.glEnableする

glEnable(GL_MULTISAMPLE);

アルファテストとマルチサンプリングの両立

普通にやったら、アルファテストしたところはギザギザなままである。
alpha.PNG
デフォルトの状態ではマルチサンプリングはフラグメントのcoverageをアルファ値のことは無視して計算している。
でも、あるオプションを使えば、coverageの計算の時にアルファ値のことを考慮してくれるのだ。
そのオプションとはこれ

glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
glSampleCoverage(0.5,GL_FALSE);

引数は全部で3つ。
  • GL_SAMPLE_ALPHA_TO_COVERAGE…アルファ値をcoverageの計算に考慮してくれる。
  • GL_SAMPLE_ALPHA_TO_ONE…アルファ値は常に1ということでcoverageを計算する
  • GL_SAMPLE_COVERAGE…..計算されたcoverageの値をAND演算で合算する。更に、生成されたサンプルマスクはglSampleCoverage()関数のinvertフラグによって逆さにすることができる。

glSampleCoverage(float value,bool invert)

この関数は、glEnableでGL_SAMPLE_COVERAGEGL_SAMPLE_ALPHA_TO_COVERAGEが有効な時に使う関数である。
引数のinvertフラグは、フラグメントのcoverageとAND演算される前に、一時的なcoverageの値がビット反転されることを意味する。

coverage

Androidの場合

Androidでマルチサンプリング

Bibliography
1. ■[3DCG[OpenGL] 本当は誰も知らない"Alpha to Coverage"]

サポートサイト Wikidot.com