1

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

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

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

SDL_DisplayFormatAlpha 非常适合使用 alpha 蒙版复制表面,但它不采用剪辑参数,它仅用于复制整个表面,而不是其中的一部分,因此是我的问题。

4

2 回答 2

0

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

于 2012-09-05T01:55:08.080 回答
0

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

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

SDL_SetSurfaceBlendMode(source, SDL_BLENDMODE_BLEND);
SDL_BlitSurface(source, sourceRect, destination, destinationRect);
于 2021-08-11T15:16:20.003 回答