2012-03-01 38 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