2

我试图找到在 SDL 中进行 alpha 混合的最有效方法。我不想回去重写渲染代码来改用 OpenGL(我读过 alpha 混合更有效),所以我想弄清楚如何从 SDL 的 alpha 中获得最大的收益混合。

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

4

3 回答 3

3

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

您可以在此处此处找到有关硬件表面的一些信息

于 2009-12-09T08:41:29.727 回答
0

决定不对该部分使用 alpha 混合。像素混合对于软件表面来说太过分了,当你想要硬件的强大功能时,就需要 OpenGL。

于 2009-12-08T23:11:09.633 回答
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

于 2010-06-23T10:28:42.263 回答