我试图找到在 SDL 中进行 alpha 混合的最有效方法。我不想回去重写渲染代码来改用 OpenGL(我读过 alpha 混合更有效),所以我想弄清楚如何从 SDL 的 alpha 中获得最大的收益混合。
我读到我可以从使用硬件表面中受益,但这意味着我必须全屏运行游戏。任何人都可以对此发表评论吗?或者其他关于 SDL 中 alpha 透明度的信息?
我试图找到在 SDL 中进行 alpha 混合的最有效方法。我不想回去重写渲染代码来改用 OpenGL(我读过 alpha 混合更有效),所以我想弄清楚如何从 SDL 的 alpha 中获得最大的收益混合。
我读到我可以从使用硬件表面中受益,但这意味着我必须全屏运行游戏。任何人都可以对此发表评论吗?或者其他关于 SDL 中 alpha 透明度的信息?
决定不对该部分使用 alpha 混合。像素混合对于软件表面来说太过分了,当你想要硬件的强大功能时,就需要 OpenGL。
将 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