2016-06-28 15 views
3

Ich versuche OpenGL rendered screen zu PNG Bild mit transparentem Hintergrund zu speichern. Aber alles, was ich im 4. Kanal bekomme, sind alle 255 Werte.Alpha-Kanal kann nicht auf 0 gesetzt werden in OpenGL + SDL2

Schon vor dem Zeichnen nichts auf dem Bildschirm und nur Clearing hilft nicht.

Was ich in OpenGL für die Initialisierung getan haben den transparenten Hintergrund zu erhalten, ist in etwa die folgenden:

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); 

Vielen Dank im Voraus.

Antwort

3

Standardmäßig fordert SDL nicht explizit einen Framebuffer mit einem Alphakanal an. Sie müssen

SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1); 

aufrufen, bevor Sie das Fenster erstellen, um sicherzustellen, dass Sie tatsächlich einen Alpha-Puffer erhalten. Beachten Sie, dass dies konzeptionell mindestens 1 Bit Alpha anfordert. Normalerweise bieten GL-Implementierungen Pixelformate/Visuals mit 0 oder 8 Bit Alpha pro Pixel. Wenn Sie sicherstellen möchten, dass Sie mindestens 8 Bit erhalten, können Sie dies auch explizit anfordern.

+0

Absolut korrekt. –