将SDL_Surface Blit到另一个SDL_Surface并应用颜色键

时间:2012-03-01 22:27:10

标签: c++ opengl sdl

我想将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为零,这导致我提到的第一个问题,但我似乎无法弄清楚如何做到这一点。我应该循环像素并设置适当的颜色以使其为零吗?

部分解决方案:

  1. 按上述方法创建paddedImage
  2. SDL_Fill使用colorkey
  3. 覆盖paddedImage
  4. “像往常一样”生成纹理
  5. 手动将图像(SDL_Surface *)像素复制到paddedImage(OGL纹理)
  6. 这种方法几乎总能期望图像具有3种颜色成分(即没有alpha通道)的情况。我现在试图通过将它们转换为4种颜色组件来解决这个问题

1 个答案:

答案 0 :(得分:1)

我认为如果你可以将SDL_Surface转换为OGL纹理,它可以与OpenGL一起使用,然后你可以使用blit函数来组合纹理,并使用SDL工作流来操作。 我不知道你想要实现什么。您希望将一个曲面转移到OGL纹理并保留Colorkey,或者只是想将颜色键表面应用到另一个曲面,然后转换为OGL纹理。 此外,你不必使用每像素alphas,因为SDL使你能够使用每个表面的alphas,但是它非常复杂,因为alphas和colorkeys可以组合在一起使用。

由于这是一个复杂的事情,请参考SDL参考,本教程也可能有用(很难处理OGL的东西): http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending