将SDL_Surface Blit到另一个SDL_Surfaces上,然后应用颜色键

Blit SDL_Surface onto another SDL_Surface and apply a colorkey

本文关键字:SDL 然后 应用 色键 颜色 另一个 Surface Blit Surfaces      更新时间:2023-10-16

我想将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为零吗?

部分解决方案:

  1. 如上所述创建paddedImage
  2. SDL_FillRect带有colorkey的paddedImage
  3. "像往常一样"生成纹理
  4. 手动将图像(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