我正在研究嵌入式Linux系统上的图形应用程序。该应用程序使用SDL,它使用/ dev / fb0。该设备具有4字节像素格式,分别用于红色,绿色,蓝色和alpha。 alpha值用于将/ dev / fb0与运动视频平面混合。
/ dev / fb0 alpha值在我直接写入/ dev / fb0时的指定工作。
不幸的是,当我调用SDL函数时,/ dev / fb0中的alpha值设置为零。 (例如,调用boxRGBA设置矩形白色会导致矩形中的每个帧缓冲像素设置为0xFFFFFF00。)
有没有办法让SDL将/ dev / fb0中的alpha值设置为我想要的值?
有很多关于alpha的SDL文档,但这似乎与SDL操作有关,而不是最终帧缓冲输出中的alpha值。
编辑 fbset输出:
mode "1360x768-60"
# D: 85.507 MHz, H: 47.716 kHz, V: 60.020 Hz
geometry 1360 768 1360 768 32
timings 11695 256 64 18 3 112 6
rgba 8/16,8/8,8/0,8/24
endmode
编辑 SDL初始化和测试矩形填充(注意这是SDL 1.2)
SDL_Init(SDL_INIT_VIDEO);
m_screen = SDL_SetVideoMode(0, 0, 0, SDL_FULLSCREEN | SDL_HWSURFACE);
SDL_ShowCursor(SDL_DISABLE);
SDL_FillRect(m_screen, NULL, SDL_MapRGBA(m_screen->format, 0x80, 0x80, 0x80, 0xFF));
SDL_Flip(m_screen);
编辑调试显示SDL_SetVideoMode()返回的SDL_Surface有一个没有alpha的SDL_PixelFormat,即Amask为0,Ashift为0,Aloss为8。
编辑在SDL_Surface上显式设置alpha通道可以得到正确的结果。但代码看起来并不令人满意:我设置的字段仅供内部使用:
m_screen = SDL_SetVideoMode(0, 0, 0, SDL_FULLSCREEN | SDL_HWSURFACE);
m_screen->format->Amask = 0xFF000000;
m_screen->format->Ashift = 24;
m_screen->format->Aloss = 0;