2012-03-01 50 views
1

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

部分解决方案:

  1. 创建paddedImage如上
  2. SDL_FillRect与colorkey的
  3. 生成纹理 “如常”
  4. 手动将图像复制paddedImage(SDL_Surface *)个像素到填充图像(OGL纹理)

Th作品几乎总是期望一些图像具有3种颜色分量的情况(即,没有alpha通道)。我试图通过将它们转换为4种颜色组件来解决此问题

+0

你调用'SDL_SetColorKey()'? – 2012-03-01 22:58:24

+0

对不起,我忘了将它包含在我的代码中。我相信我是这么做的,但我现在不在家。如有必要,我会尽快编辑它。 – NordCoder 2012-03-02 10:05:45

+0

您需要在blit之前调用'SDL_SetColorKey()'。另外,你不需要'static_cast ()',因为它被隐式转换覆盖。我不认为别的什么与你在这里有什么关系。 – 2012-03-02 15:04:07

回答

0

我认为如果您可以将SDL_Surface s转换为OGL纹理,那么它可以与OpenGL一起使用,然后您可以使用blit功能将您的纹理以及使用SDL工作流程操纵事物。 我不知道你想实现什么。您希望将一个曲面转换为OGL纹理并保留该Colorkey,或者只是将颜色键表面应用于另一个曲面,然后将其转换为OGL纹理。 此外,您不必使用每像素alpha,因为SDL使您可以使用per-surface alphas,但其相当复杂,因为alpha和colorkeys可以组合使用。

由于这是一个复杂的事情,请参阅SDL,而本教程可能也有帮助(强硬它不处理OGL的东西): http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending

+0

所以你的建议是首先将SDL_Surface转换为OpenGL纹理,然后结合两个OpenGL纹理?我想将一个色键应用于填充图像。如果我有一张28x20的图像,则会填充到32x32(POT)纹理。填充像素具有colorkey的颜色。然后我应用colorkey,使匹配的所有像素变得透明。我不知道应该以何种顺序进行。 我已经研究过这个链接,并尝试过不适用的组合。我找到了一个解决方法,它涉及大量的手动像素操作。我回家后会发布它。 – NordCoder 2012-04-18 08:09:59