2012-03-01 3 views
1

を適用します。私はいずれかの色に関係なく、すべてのピクセルをカラーキーイングするか、カラーキー何もしません。私はいろいろなことを試みましたが、どれもうまくいかないようです。ブリットSDL_Surfaceに、私は(NPOT-> POTように)パディングとOpenGLのテクスチャにSDL_Surfaceにロードし、その後、表面上のカラーキーを適用したいカラーキー

ここに私のコードの作業抜粋です。私はカラーキー(範囲[0-1])用のカスタムカラークラスを使用します。オンラインで見つけるSDL + OpenGLのテクスチャロードコードに似たコードを使用して、私はpaddedImageからOpenGLのテクスチャを生成し、その後

// 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); 

(I」必要に応じて投稿する)。このコードは、パディングの有無にかかわらずテクスチャを必要とし、問題ではないと思われる場合に機能します。

私は私が言及した最初の問題が発生するアルファゼロを持つようにpaddedImage内のすべてのピクセルを設定することを実現するが、私はこれを行う方法を見つけ出すように見えることはできません。私は単にピクセルをループし、適切な色をアルファゼロに設定する必要がありますか?

部分的な解決策:

  1. カラーキー
  2. とpaddedImageは、画像(SDL_Surfaceに*)ピクセルをコピー手動で "いつものように"
  3. をテクスチャを生成SDL_FillRect
  4. 上記のようpaddedImageを作成します。 paddedImage(OGLテクスチャ)

のThへほとんどの場合、画像が3つの色成分(すなわち、アルファチャンネルなし)。私は今それを4つのカラーコンポーネントに変換することで修正しようとしています

+0

あなたは 'SDL_SetColorKey()'を呼び出していますか? –

+0

はい、申し訳ありませんが、私はそれを私のコードに含めるのを忘れていました。私はそれが私のやり方だと信じていますが、私は今家にいません。私は必要に応じてすぐに編集します。 – NordCoder

+0

あなたは 'SDL_SetColorKey()'前ブリット呼び出す必要があります。それは暗黙のキャストによりカバーされているためまた、あなたは 'static_castをを()'は必要ありません。私はあなたがここにいるものと何か他のものがあるとは思わない。 –

答えて

0

SDL_SurfaceをOGLテクスチャに変換することができれば、それはOpenGLと一緒に使用できると思います。テクスチャを作成し、SDLワークフローを使用して操作することができます。 私はあなたが達成したいことを知っていません。あるサーフェスをOGLテクスチャに転送してColorkeyを保持したい場合や、カラーキー付きサーフェスを別のサーフェスに適用してOGLテクスチャに変換したい場合があります。 また、ピクセル単位のアルファを使用する必要はありません。SDLではサーフェスごとのアルファを使用できますが、どのようなアルファとカラーキーを組み合わせて一緒に使用できるかは非常に複雑です。

これは複雑なものであるため、SDLリファレンスを参照してください、このチュートリアルでは(厳しいそれはOGLのものを扱うdoesntの)あまりにも役立つかもしれないが: http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending

+0

あなたの提案は、最初にSDL_SurfaceをOpenGLテクスチャに変換してから、2つのOpenGLテクスチャを組み合わせることです。私はパディングされた画像にカラーキーを適用したい。私が28x20イメージを持っている場合、これは32x32(POT)テクスチャにパディングされます。パディングピクセルにはカラーキーの色があります。次に、一致するすべてのピクセルが透明になるようにカラーキーを適用します。これをどのような順序で行うべきかはわかりません。 私はすでに事前にリンクを研究し、うまくいかなかったさまざまな組み合わせを試しました。私は多くの手動ピクセル操作を含む回避策を見つけました。私が家に帰ると、私はそれを掲示します。 – NordCoder

関連する問題