2

SDLでアルファブレンドするための最も効率的な方法を見つけようとしています。代わりにOpenGLを使用するようにレンダリングコードを書き直したくないので(私が読んだのはアルファブレンディングではるかに効率的です)、SDLのアルファを最大限に活用する方法を見つけようとしていますブレンディング。

ハードウェアサーフェスを使用することでメリットが得られることを読みましたが、これはゲームをフルスクリーンで実行する必要があることを意味します。誰かがこれについてコメントできますか?または、SDLのアルファ透明度に関して他に何かありますか?

4

3 に答える 3

3

私はかつてsdlハードウェアサーフェスで遊んだことがありますが、それは最も楽しい経験ではありませんでした。SDLは非常に使いやすいですが、効率が上がると、そのようなタスクのために特別に設計されたものに固執する必要があります。ここではOpenGLが良い選択です。いつでもSDL(ウィンドウおよびイベント管理)とopenGL(グラフィックス)を組み合わせて、すでに記述されているコードの一部を使用できます。

ここここでハードウェア表面に関するいくつかの情報を見つけることができます

于 2009-12-09T08:41:29.727 に答える
0

SDLでOpenGLを使用します。GLライブラリを知ることは良いことです(最近、グラフィックス以外の高速化されたものの使用はほとんど見られません。GUIでさえ今はそれを使用しています)。SDL_imageには、アルファチャネルをチェックする方法があります。画像ファイルへのパスからテクスチャを作成する(SDL_imageのIMG_Load()関数を使用する)私の関数には、次のものがあります。

// if we successfully open a file
// do some gl stuff then
SDL_PixelFormat *format = surface->format;

int width, height;
width = pow2(surface->w);
height = pow2(surface->h);

SDL_LockSurface(surface); // Call this whenever reading pixels from a surface

/* Check for alpha channel */
if (format->Amask)
  glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
else
  glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);

SDL_UnlockSurface(surface);

pow2()は、数値を次に近い2の累乗に丸めます。最近の多くのビデオカードは、テクスチャサイズの2の累乗以外の値を処理できますが、私が知る限り、それらは間違いなく最適化されていません(テスト済みのフレームレート)。他のビデオカードはレンダリングを拒否するだけで、アプリがクラッシュする可能性があります。

コードはここにあります:http ://www.tatsh.net/2010-06-19/using-sdlimage-and-sdlttf-opengl

于 2010-06-23T10:28:42.263 に答える
0

その部分にアルファブレンディングを使用しないことにしました。ピクセルブレンディングはソフトウェアサーフェスには多すぎるため、ハードウェアのパワーが必要な場合はOpenGLが必要です。

于 2009-12-08T23:11:09.633 に答える