我想將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