我想将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为零,这导致我提到的第一个问题,但我似乎无法弄清楚如何做到这一点。我应该循环像素并设置适当的颜色以使其为零吗?
部分解决方案:
这种方法几乎总能期望图像具有3种颜色成分(即没有alpha通道)的情况。我现在试图通过将它们转换为4种颜色组件来解决这个问题
答案 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