将SDL_Surface Blit到另一个SDL_Surfaces上,然后应用颜色键
Blit SDL_Surface onto another SDL_Surface and apply a colorkey
我想将SDL_Surface加载到带有填充的OpenGL纹理中(这样NPOT->POT),然后在曲面上应用颜色键。我要么最终为所有像素设置颜色键,不管它们的颜色如何,要么根本不为任何东西设置颜色键。我尝试了很多不同的方法,但似乎都不起作用。
这是我的代码的工作片段。我为colorkey使用自定义颜色类(范围[0-1]):
// Create an empty surface with the same settings as the original image
SDL_Surface* paddedImage = SDL_CreateRGBSurface(image->flags, width, height,
image->format->BitsPerPixel,
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
0xff000000,
0x00ff0000,
0x0000ff00,
0x000000ff
#else
0x000000ff,
0x0000ff00,
0x00ff0000,
0xff000000
#endif
);
// Map RGBA color to pixel format value
Uint32 colorKeyPixelFormat = SDL_MapRGBA(paddedImage->format,
static_cast<Uint8>(colorKey.R * 255),
static_cast<Uint8>(colorKey.G * 255),
static_cast<Uint8>(colorKey.B * 255),
static_cast<Uint8>(colorKey.A * 255));
SDL_FillRect(paddedImage, NULL, colorKeyPixelFormat);
// Blit the image onto the padded image
SDL_BlitSurface(image, NULL, paddedImage, NULL);
SDL_SetColorKey(paddedImage, SDL_SRCCOLORKEY, colorKeyPixelFormat);
之后,我使用类似于在线SDL+OpenGL纹理加载代码的代码从paddedImage生成OpenGL纹理(如果需要,我会发布)。如果我只想要有填充或没有填充的纹理,那么这段代码就可以工作,而且可能不是问题所在。
我意识到我将paddedImage中的所有像素都设置为alpha为零,这导致了我提到的第一个问题,但我似乎不知道如何做到这一点。我应该在像素上循环并设置适当的颜色以使alpha为零吗?
部分解决方案:
- 如上所述创建paddedImage
- SDL_FillRect带有colorkey的paddedImage
- "像往常一样"生成纹理
- 手动将图像(SDL_Surface*)像素复制到paddedImage(OGL纹理)
这几乎总是在图像具有3个颜色分量(即没有alpha通道)的某些情况下起作用。我现在正试图通过将它们转换为4种颜色组件
我认为它可以与OpenGL一起使用,如果你可以将SDL_Surface
转换为OGL纹理,然后你可以使用blit函数来组合你的纹理,并使用SDL工作流来操作东西。我不知道你想要实现什么。您希望将一个曲面传递到OGL纹理并保留"Colorkey",或者只希望将颜色键控曲面应用到另一个曲面,然后将其转换为OGL纹理。此外,你不必使用每像素字母,因为SDL让你能够使用每表面字母,但它非常复杂,因为什么字母和颜色键可以组合在一起使用。
由于这是一件复杂的事情,请参阅SDL参考资料,本教程可能也会有所帮助(很难,它无法处理OGL内容):http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- SDL 操纵杆按钮按下/C++
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 如何正确地推回然后遍历堆中对象的向量?