使用 Alpha 通道复制SDL_Surfaces
Copying SDL_Surfaces with Alpha Channels
我在保留被复制/剪辑块传输的表面的 alpha 通道时遇到了问题(将表面的部分块传输到较小的表面上,它们是精灵表)。我已经尝试了各种解决方案,但最终结果是任何应该具有透明度的表面最终都会变得完全不透明(alpha 蒙版变成白色)。
所以我的问题是,如何将一个 RGBA SDL_Surface复制到另一个新表面(也是 RGBA),包括 alpha 通道?如果有任何不同,如何将 RGBA 表面的一部分复制到新的 RGBA 表面(与源表面的剪裁部分的大小相同),就像瓷砖片块一样。
似乎SDL_BlitSurface混合了 alpha 通道,因此,例如,当我想将磁贴从我的图块表表面复制到新表面(当然是空白的,我假设 SDL 默认用黑色或白色填充表面)时,它最终会丢失它的 alpha 掩码,因此当该图块最终被块传输到屏幕时, 它不会与屏幕上的任何内容混合。
SDL_DisplayFormatAlpha复制带有 alpha 蒙版的表面效果很好,但它不需要剪辑参数,它只是为了复制整个表面,而不是其中的一部分,因此我的问题。
如果这么多年过去了,有人仍然想知道:
在对表面进行点亮处理之前,您需要确保源(SDL_Surface)的混合模式设置为SDL_BLENDMODE_NONE,如文档中所述:SDL_SetSurfaceBlendMode()。应该是这样简单的东西:
SDL_SetSurfaceBlendMode(source, SDL_BLENDMODE_BLEND);
SDL_BlitSurface(source, sourceRect, destination, destinationRect);
我以前遇到过这个问题,还没有得到官方答案。但是,我认为唯一的方法是编写自己的复制函数。http://www.libsdl.org/docs/html/sdlpixelformat.html此页面将帮助您了解SDL_Surface如何存储颜色信息。请注意,高于和低于 8 位的颜色之间存在巨大差异。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何与 SDL 库链接?
- 为什么我的C++代码不呈现 SDL 矩形?
- 为什么要在初始化SDL之前在SDL中声明指针
- C++/SDL 如何覆盖数组?
- SDL surfaces and BMPs