0

*.png ファイルがあり、テクスチャから異なる 8x8 px パーツを取得して、ビットマップ (SDL_Surface だと思いますが、そうではないかもしれません) に配置したいのですが、次のようにします。

画像。

現在、ビットマップなしでレンダリングしています。つまり、各テクスチャを呼び出して、フレームごとに画面に直接パーツを描画していますが、遅すぎます。各 *.png をロードしてビットマップを分離し、それらを使用してビデオ メモリを渡し、1 つの大きなビットマップだけを呼び出す必要があると思いますが、間違っている可能性があります。それを行う最速の方法が必要です。これのコードが必要です(SDL 1.3ではなくSDL 2)。また、ここで明確な OpenGL を使用する必要があるのでしょうか?

更新:
または、*.png を int 配列に読み込んで、通常の数値と同じように使用し、それらを 1 つの大きな int 配列に配置してから、SDL_Surface/SDL_Texture に変換する必要があるのでしょうか? これが一番いいようですが、どうやって書くのですか?

更新 2:
各ブロックのピクセルの色は、写真に表示されているものと同じではなく、透明にすることもできます。写真は一例です。

4

3 に答える 3

1

ビットマップがSDL_Texture(s)としてロードされていると仮定すると、それらを別のテクスチャに合成するにはSDL_SetRenderTargetを使用します。

SDL_SetRenderTarget(renderer, target_texture);
SDL_RenderCopy(renderer, texture1, ...);
SDL_RenderCopy(renderer, texture2, ...);
...
SDL_SetRenderTarget(renderer, NULL);

レンダー ターゲットを設定してからリセットする (NULL テクスチャ パラメータを指定して SDL_SetRenderTarget を呼び出す) までの間に実行するすべてのレンダリング操作は、指定されたテクスチャへのレンダラーになります。その後、このテクスチャを他のテクスチャと同じように使用できます。

于 2013-11-06T16:42:58.090 に答える
1

「無地」について尋ねたとき、「コピー元の .png の 8x8 ピクセル領域では、64 ピクセルすべてが同じ同じ RGB 値を持っていますか?」という意味でした。あなたの図ではそのように見えるので、これはどうですか:

を作成し、そのメンバーがSDL_Surface指すメモリの 8x8 ピクセル領域を、元の .png から読み取った値で直接ペイントするのはどうですか。pixelsSDL_Surface

完了したら、そのサーフェスを に変換してSDL_Textureレンダリングます。

SDL_UpdateTexture()あなたはすべての電話を避けるでしょう。

とにかく、ここにいくつかのサンプルコードがあります。というクラスを作成するとしますEightByEight

  class EightByEight
  {
    public:
      EightByEight( SDL_Surface * pDest, Uint8 r, Uint8 g, Uint8 b):
          m_pSurface(pDest),
          m_red(r),
          m_green(g),
          m_blue(b){}

      void BlitToSurface( int column, int row );

    private:
      SDL_Surface * m_pSurface;
      Uint8 m_red;
      Uint8 m_green;
      Uint8 m_blue;
  };

タイプのオブジェクトを作成するには、ポインターと、赤、緑、青の値をいくつかEightByEight渡します。SDL_Surfaceこの RGB は、現在読み取り中の .png の特定の 8x8 ピクセル領域から取得した RGB 値に対応します。SDL_Surfaceこの RGB 値を使用して、ピクセルの特定の 8x8 ピクセル領域をペイントします。

したがって、 の領域をペイントするSDL_Surface場合は、関数を使用BlitToSurface()して列と行の値を渡します。たとえば、SDL_Surfaceを 8x8 ピクセルの正方形に分割した場合、BlitToSurface(3,5) は、4 列目と 5 行目の正方形を、作成時に設定した RGB 値で塗りつぶすことを意味します。

は次のBlitToSurface()ようになります。

void EightByEight::BlitToSurface(int column, int row)
{
  Uint32 * pixel = (Uint32*)m_pSurface->pixels+(row*(m_pSurface->pitch/4))+column;

  // now pixel is pointing to the first pixel in the correct 8x8 pixel square 
  // of the Surface's pixel memory. Now you need to paint a 8 rows of 8 pixels, 
  // but be careful - you need to add m_pSurface->pitch - 8 each time 

  for(int y = 0; y < 8; y++)
  {
      // paint a row
      for(int i = 0; i < 8; i++)
      {
        *pixel++ = SDL_MapRGB(m_pSurface->format, m_red, m_green, m_blue);
      }

      // advance pixel pointer by pitch-8, to get the next "row".
      pixel += (m_pSurface->pitch - 8);
   }
}

構築時にRGB値を事前に計算することで、おそらくさらに高速化できると確信しています。または、テクスチャからピクセルを読み取る場合は、おそらく SDL_MapRGB() を省略できます (ただし、Surface のピクセル形式が .png と異なる場合に備えてあります)。

memcpyおそらくRGB値への8つの個別の割り当てよりも高速ですが、テクニックを実証したいだけです。実験できます。

したがって、EightByEight作成するすべてのオブジェクトは、すべて同じ を指しますSDL_Surface

そして、完了したら、それを に変換しSDL_SurfaceSDL_Textureblit するだけです。

于 2013-11-15T12:32:16.607 に答える