Drowsy Dog's Diary

any note, any thought

2014年1月31日
by kazoo
0 comments

glReadPixels()の alpha の値

めもん。

GLUTとOpenGLで描画したとある領域を glReadPixels() してフレームをキャプチャする。
データはRGBAで、透明をちゃんと読み出したいのだけど、なんか環境によってアルファの値がすべて FF になっていることがあった。

ごく単純に

だけやっても、α=0なのでキャプチャ結果は真っ黒を期待しているんだけど、実行環境によって青になったりする。

RGBA を指定しているのになんでだー?と、思ったら。

glutInitDisplayMode

GLUT_RGBA
Bit mask to select an RGBA mode window. This is the default if neither GLUT_RGBA nor GLUT_INDEX are specified.

GLUT_RGB
An alias for GLUT_RGBA.

おお。GLUT_RGB と GLUT_RGBA って同じものだったのか。。

ということで、

とするのが正解だったらしい。

2013年4月23日
by kazoo
0 comments

glxinfo – 3Dアクセラレーションの確認

ふわふわしたメモ

懇意にしていただいている とあるクラウド屋さんに、OpenGL 的に重い処理をクラウド側でやるのでグラフィックボードを乗っけてくれないかとお願いをしたところ、こころよく OK をいただき、セッティングしてくれた。
(X を立ち上げるのでクラウドだけど起動時モニター繋いでもらうとかいろいろめんどい。感謝)
処理内容は GLUT で描画された 3D 画像を何万フレームも書き出して、最後にそれを動画にエンコードするようなもの。

で、繋いでもらったはいいけど速度以外にどうやってアクセラレーションされてるかどうかを確認すればいいんだろう、というメモ。
ふわふわなので突っ込み歓迎です。

glxinfo をつかう

glxinfo は使われている libGL のバージョンやドライバの情報を調べるプログラム。

とすれば、

OpenGL vendor string: Intel Inc.
OpenGL renderer string: Intel HD Graphics 3000 OpenGL Engine
OpenGL version string: 2.1 APPLE-7.32.12
OpenGL shading language version string: 1.20
….
みたいな情報が確認できる(MacbookAir の場合)。

んで、そのクラウド環境では、

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: Quadro 4000/PCIe/SSE2
OpenGL version string: 4.3.0 NVIDIA 310.44

とかになる。ちゃんと NVIDIA のドライバが Quadro ハードウェアを動かしてることがわかる。
同じサーバで VNC 環境になっている display:1 を見ると、

OpenGL vendor string: Mesa project: www.mesa3d.org
OpenGL renderer string: Mesa GLX Indirect
OpenGL version string: 1.2 (1.5 Mesa 6.5.1)

こちらではアクセラレーションなしのレンダリングが行われる。

あと、描画を行っているプロセスの、/proc/{PROCID}/maps を見て libGL.so をリンクしているかどうか?も目安になるらしいが、これだと VNC 環境でもリンクされていたので確証なし。。

2012年10月30日
by kazoo
0 comments

iOS6でglReadPixels( )が空っぽになる

OpenGL ES view のフレームバッファのキャプチャについて。

こんな感じでしていました。

が、iOS6 ではこの glReadPixels() の返りが真っ暗になっていました。

Apple オフィシャルの Q&A を読むと、
http://developer.apple.com/library/ios/#qa/qa1704/_index.html

By default, the contents of a renderbuffer are invalidated after you present them to the display. Therefore, to get defined results when reading your OpenGL ES content, you must do one of the following:

1) Call glReadPixels before calling EAGLContext/-presentRenderbuffer:, or

2) Set the CAEAGLLayer’s retained backing property to true to retain the contents of the layer. However, this can have adverse performance implications so you are cautioned to use this setting only when necessary.

The above restrictions do not apply for offscreen, non-displayable framebuffers.

要は、表示してしまっている EAGLContext は、renderbuffer にあるピクセルデータがすでに正常なデータではないので、

1) 表示の前に読むか
2) retained back buffer を CAEAGLLayer に設定しろ

ということらしいです。
試しに、EAGLLayer を作るときに、

と、drawableProperties に kEAGLDrawablePropertyRetainedBacking を設定してやれば正常にキャプチャできました。

ただし、この方法は性能に影響が出るので、必要なときにだけ設定するようにしましょう。
また、表示していないフレームバッファについては、この設定は必要ないとのことです。