2016-06-28 10 views
3

OpenGL rendered screenPNGイメージを透明な背景に保存しようとしています。しかし、私が4番目のチャンネルに入っているのは、すべて255の値です。OpenGL + SDL2でアルファチャンネルを0に設定できません

画面上に何かを描画する前であっても、クリアするだけでは役に立ちません。事前に

gWindow = SDL_CreateWindow("View", SDL_WINDOWPOS_UNDEFINED, 
     SDL_WINDOWPOS_UNDEFINED, width, height, 
     SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE); 
gContext = SDL_GL_CreateContext(gWindow); 
GLfloat clear_col[4] = {0.0, 0.0, 0.0, 0.0}; 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(fov, width/(float)height, nearplane, farplane); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glClearColor(clear_col[0], clear_col[1], clear_col[2], clear_col[3]); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 
glShadeModel(GL_FLAT); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
pixels = (unsigned char*) malloc(width*height*4); 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
// checking the values 
FILE*ffp = fopen("saved.bin", "wb"); 
fwrite(pixels, width*height*4, 1, ffp); 
fclose(ffp); 

ありがとう:私は大きく以下の透明な背景を得るために初期化のためのOpenGLでやっていること

答えて

3

デフォルトでは、SDLはアルファチャンネルを持つフレームバッファを明示的に要求しません。あなたは、あなたが実際にアルファバッファを取得していることを確認するウィンドウを作成する前に

SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1); 

を呼び出す必要があります。これは、少なくとも1ビットのアルファを概念的に要求することに注意してください。通常、GLの実装では、1ピクセルあたり0または8ビットのアルファのいずれかを持つピクセル形式/ビジュアルを提供します。少なくとも8ビットを取得したい場合は、それを明示的に要求することもできます。

+0

絶対に正しいです。 –

関連する問題