我想将SDL_Surface加载到带填充的OpenGL纹理中(以便NPOT-> POT),然后在表面上应用颜色键。无论颜色如何,我最终都会对所有像素进行着色,或者根本不使用任何颜色。我尝试了很多不同的东西,但他们都没有工作。将SDL_Surface切换到另一个SDL_Surface并应用一个色键
这是我的代码的工作片段。我使用自定义的颜色类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);
然后,我生成从paddedImage一个OpenGL纹理使用类似于代码网上找到了SDL + OpenGL的纹理加载代码(I”如果需要的话会发布)。如果我只想使用或不使用填充的纹理,并且可能不是问题,则此代码有效。
我意识到我将paddedImage中的所有像素都设置为alpha,导致我提到的第一个问题,但我似乎无法弄清楚如何做到这一点。我应该只是遍历像素,并设置适当的颜色具有alpha零?
部分解决方案:
- 创建paddedImage如上
- SDL_FillRect与colorkey的
- 生成纹理 “如常”
- 手动将图像复制paddedImage(SDL_Surface *)个像素到填充图像(OGL纹理)
Th作品几乎总是期望一些图像具有3种颜色分量的情况(即,没有alpha通道)。我试图通过将它们转换为4种颜色组件来解决此问题
你调用'SDL_SetColorKey()'? – 2012-03-01 22:58:24
对不起,我忘了将它包含在我的代码中。我相信我是这么做的,但我现在不在家。如有必要,我会尽快编辑它。 – NordCoder 2012-03-02 10:05:45
您需要在blit之前调用'SDL_SetColorKey()'。另外,你不需要'static_cast()',因为它被隐式转换覆盖。我不认为别的什么与你在这里有什么关系。 –
2012-03-02 15:04:07