Goodbye, World

日々のプログラミングで得た経験を個人的な備忘録としてまとめてます.他のブログ・ページを参考させて頂いている部分が多いので,参考ページへのリンクを併記しております.

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やだ。。。