无法在 OpenGL + SDL2 中将 Alpha 通道设置为 0
Cannot set Alpha channel to 0 in OpenGL + SDL2
我正在尝试将 OpenGL rendered screen
保存为具有透明背景的 PNG
图像。但是我在第 4 个频道中得到的只是 255
个值。
即使在屏幕上绘制任何东西之前,只是清除也无济于事。
我在OpenGL中为了得到透明背景所做的初始化工作大致如下:
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);
提前致谢。
默认情况下,SDL 不会明确请求具有 alpha 通道的帧缓冲区。你必须打电话给
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1);
在创建 window 之前确保您确实获得了 alpha 缓冲区。请注意,这在概念上要求至少 1 位 alpha。通常,GL 实现为像素 formats/visuals 提供每个像素 0 或 8 位的 alpha。如果您想确保至少获得 8 位,您也可以明确要求。
我正在尝试将 OpenGL rendered screen
保存为具有透明背景的 PNG
图像。但是我在第 4 个频道中得到的只是 255
个值。
即使在屏幕上绘制任何东西之前,只是清除也无济于事。
我在OpenGL中为了得到透明背景所做的初始化工作大致如下:
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);
提前致谢。
默认情况下,SDL 不会明确请求具有 alpha 通道的帧缓冲区。你必须打电话给
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1);
在创建 window 之前确保您确实获得了 alpha 缓冲区。请注意,这在概念上要求至少 1 位 alpha。通常,GL 实现为像素 formats/visuals 提供每个像素 0 或 8 位的 alpha。如果您想确保至少获得 8 位,您也可以明确要求。