「無地」について尋ねたとき、「コピー元の .png の 8x8 ピクセル領域では、64 ピクセルすべてが同じ同じ RGB 値を持っていますか?」という意味でした。あなたの図ではそのように見えるので、これはどうですか:
を作成し、そのメンバーがSDL_Surface
指すメモリの 8x8 ピクセル領域を、元の .png から読み取った値で直接ペイントするのはどうですか。pixels
SDL_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_Surface
てSDL_Texture
blit するだけです。