glReadPixelsによるalpha channelを含んだ画像保存
OpenGLでレンダリングした3次元モデルを仮想視点からキャプチャする際にハマったのでメモ.
glReadPixelsを用いてキャプチャを行う場合,まずピクセルの格納情報を宣言しておく必要がある.
glPixelStorei (GL_PACK_ALIGNMENT, 4);
ここで,第1引数は保存に用いる命令に依って要選択 GL_PACK_ALIGNMENT or GL_UNPACK_ALIGNMENT
第2引数は保存対象のチャンネル数に応じた値を与える.
今回は"glReadPixels"を用いて"4 channel"の画像を保存するので上記の命令になる.
(実際には第2引数は2の累乗しか許されないので,標準的なBGR画像を作成する際でも切り捨ての"1"を与える.気持ち悪いですね。。。)
その後,画像用の適当な入れ物(ここではcv::Mat)を用意して下記の命令により保存完了!
glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, cvMat);
。。。と思ったんですが,何故かalpha channelが常に255になっている.
レンダリング自体は上手くいっているのに,保存の際にのみ正しい値が反映されず.
原因不明過ぎて死にたくなりましたが,色々探っていると,原因はglutInitDisplayModeにあることが判明.
glutInitDisplayMode(... GL_RGBA ...) -> glutInitDisplayMode(... GL_ALPHA ...)
で一応解決.どうやらGL_RGBA と GL_RGB は内部的に定義が同じなようで.
もうOpenGLやだ。。。