如何在SDL中进行硬件加速alpha混合?

时间:2009-12-08 17:22:10

标签: c++ sdl alphablending

我正在努力寻找在SDL中进行alpha混合的最有效方法。我不想回头重写渲染代码而不是使用OpenGL(我已经阅读过使用alpha混合的效率更高),所以我想弄清楚如何从SDL的alpha中获得最大的收益混合

我读过我可以从使用硬件表面中受益,但这意味着我必须全屏运行游戏。任何人都可以评论这个吗?或者关于SDL中alpha透明度的其他任何内容?

3 个答案:

答案 0 :(得分:3)

我曾经玩过sdl硬件表面,这不是最愉快的体验。 SDL非常易于使用,但是当它达到效率时,你应该坚持使用专门为此类任务设计的东西。 OpenGL在这里是个不错的选择。您可以随时将SDL(窗口和事件管理)与openGL(图形)混合使用,并使用一些已编写的代码。

您可以在硬件表面herehere

上找到一些信息

答案 1 :(得分:0)

决定不对该部分使用alpha混合。对于软件表面而言,像素混合太多了,当您需要硬件的强大功能时,需要OpenGL。

答案 2 :(得分:0)

将OpenGL与SDL一起使用。很高兴了解GL库(这些天我很难看到非图形加速的东西,甚至GUI现在都使用它)。 SDL_image有一种检查alpha通道的方法。我从路径到图像文件创建纹理的函数(使用SDL_image的IMG_Load()函数)具有:

// if we successfully open a file
// do some gl stuff then
SDL_PixelFormat *format = surface->format;

int width, height;
width = pow2(surface->w);
height = pow2(surface->h);

SDL_LockSurface(surface); // Call this whenever reading pixels from a surface

/* Check for alpha channel */
if (format->Amask)
  glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
else
  glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);

SDL_UnlockSurface(surface);

pow2()只是将数字四舍五入到下一个最接近2的幂。现在很多视频卡可以处理纹理大小的2个值的非幂,但据我所知,它们肯定没有针对它进行优化(测试帧率)。其他视频卡只会拒绝呈现,您的应用可能会崩溃等等。

代码在这里:http://www.tatsh.net/2010-06-19/using-sdlimage-and-sdlttf-opengl