使用Alpha通道复制SDL_Surfaces

时间:2012-07-03 19:59:45

标签: c++ sdl alpha

我遇到的问题是保留表面的alpha通道被复制/剪辑blitting(将表面的部分划分到较小的表面上,它们是spritesheets)。我尝试了各种解决方案,但最终结果是任何应该具有透明度的表面最终变得完全不透明(alpha蒙版变为白色)。

所以我的问题是,如何将一个RGBA SDL_Surface复制到另一个新曲面(也是RGBA),包括alpha通道?如果它有任何不同,如何将RGBA表面的一部分复制到新的RGBA表面(与源表面的剪切部分大小相同),ala tilesheet blitting。

似乎SDL_BlitSurface混合了alpha通道,所以例如,当我想将瓷砖表面上的瓷砖复制到新表面时(当然,这是空白的,我假设SDL用黑色或白色填充表面默认情况下),它最终失去了它的alpha蒙版,这样当这个图块最终blit到屏幕时,它不会与屏幕上的任何内容混合。

SDL_DisplayFormatAlpha可以很好地复制带有alpha蒙版的曲面,但它不带剪辑参数,它只是复制整个曲面而不是它的一部分,因此我的问题。

2 个答案:

答案 0 :(得分:0)

之前我遇到过这个问题,还没有得到官方答复。 但是,我认为唯一的方法是编写自己的复制功能。 http://www.libsdl.org/docs/html/sdlpixelformat.html 此页面将帮助您了解SDL_Surface如何存储颜色信息。请注意,8位以上和以下的颜色之间存在巨大差异。

答案 1 :(得分:0)

如果这么多年后还有人想知道:

在对表面进行 bliting 之前,您需要确保将源(即 SDL_Surface)的混合模式设置为 SDL_BLENDMODE_NONE,如文档中所述:SDL_SetSurfaceBlendMode()。应该看起来像这样简单:

SDL_SetSurfaceBlendMode(source, SDL_BLENDMODE_BLEND);
SDL_BlitSurface(source, sourceRect, destination, destinationRect);