めもん。
GLUTとOpenGLで描画したとある領域を glReadPixels() してフレームをキャプチャする。
データはRGBAで、透明をちゃんと読み出したいのだけど、なんか環境によってアルファの値がすべて FF になっていることがあった。
ごく単純に
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <GL/glut.h> static int w = 200, h = 200; static bool writeFlag = true; void display(void) { glClear(GL_COLOR_BUFFER_BIT); if (writeFlag) { unsigned char *imgBuf = (unsigned char*)malloc(w * h * 4); if (imgBuf == NULL) exit(2); glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, imgBuf); // ... // SaveRGBAImageAsPng // ... exit(0); } glFlush(); } void init(void) { glClearColor(0.0, 0.0, 1.0, 0.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(w, h); glutCreateWindow(argv[0]); glutDisplayFunc(display); init(); glutMainLoop(); return 0; } |
だけやっても、α=0なのでキャプチャ結果は真っ黒を期待しているんだけど、実行環境によって青になったりする。
RGBA を指定しているのになんでだー?と、思ったら。
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 って同じものだったのか。。
ということで、
1 |
glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA); |
とするのが正解だったらしい。