我正在研究嵌入式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;