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

Posted

技术标签:

【中文标题】如何在 SDL 中进行硬件加速 Alpha 混合?【英文标题】:How to do hardware accelerated alpha blending in SDL? 【发布时间】:2009-12-08 17:22:10 【问题描述】:

我正在努力寻找在 SDL 中进行 Alpha 混合的最有效方法。我不想回去重写渲染代码来改用 OpenGL(我已经读过 alpha 混合更有效),所以我想弄清楚如何从 SDL 的 alpha 中获得最大的汁液混合。

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

【问题讨论】:

看起来 SDL 2 支持它:wiki.libsdl.org/SDL_SetTextureBlendMode / lazyfoo.net/tutorials/SDL/13_alpha_blending/index.php 【参考方案1】:

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

您可以找到有关硬件表面here 和here 的一些信息

【讨论】:

【参考方案2】:

决定不对该部分使用 Alpha 混合。像素混合对于软件表面来说太过分了,如果您想要硬件的强大功能,则需要 OpenGL。

【讨论】:

【参考方案3】:

将 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

【讨论】:

以上是关于如何在 SDL 中进行硬件加速 Alpha 混合?的主要内容,如果未能解决你的问题,请参考以下文章

SDL2 C++ 截图

如何使用 OpenGL 在 SDL 中获得正确的 SourceOver alpha 合成

如何防止 Qt 对 QListView 中的图标进行 alpha 混合选择?

如何在所有平台上使用硬件加速绘制图像?

Three.js中同一网格面上的多个透明纹理

如何在手动“叠加”混合操作中处理 alpha?