SDL_Surface to IDirect3DTexture - PullRequest
       41

SDL_Surface to IDirect3DTexture

0 голосов
/ 10 апреля 2010

Может ли кто-нибудь помочь с преобразованием объекта SDL_Surface, текстуры, загруженной из файла, в объект IDirect3DTexture9.

1 Ответ

1 голос
/ 10 апреля 2010

Честно говоря, я не знаю, почему вы захотите это сделать. Это звучит как действительно ужасная идея по разным причинам, поэтому, пожалуйста, расскажите нам, почему вы хотите сделать это, чтобы мы могли убедить вас не делать этого;).

Между тем, краткий обзор того, как вы это сделаете:

IDirect3DTexture9* pTex = NULL;
HRESULT            hr   = S_OK;
hr = m_d3dDevice->CreateTexture(
    surface->w,
    surface->h,
    1,
    usage,
    format,
    D3DPOOL_MANAGED,
    &pTex,
    NULL);

Это создает фактическую текстуру с размером и форматом SDL_Surface. Вы должны будете заполнить использование самостоятельно, в зависимости от того, как вы хотите его использовать (см. D3DUSAGE). Вам также придется выяснить формат самостоятельно - вы не можете напрямую отобразить SDL_PixelFormat на D3DFORMAT. Это будет непросто, если вы точно не знаете, в каком формате пикселей используется SDL_Surface.

Теперь вам нужно записать данные в текстуру. Вы не можете использовать прямую memcpy здесь, так как SDL_Surface и фактическая текстура могут иметь разные шаги. Вот некоторый непроверенный код, который может сделать это для вас:

HRESULT        hr;
D3DLOCKED_RECT lockedRect;

// lock the texture, so that we can write into it
// Note: if you used D3DUSAGE_DYNAMIC above, you should 
// use D3DLOCK_DISCARD as the flags parameter instead of 0.
hr = pTex->LockRect(0, &lockedRect, NULL, 0);
if(SUCCEEDED(hr))
{
    // use char pointers here for byte indexing
    char*  src     = (char*) surface->pixels;
    char*  dst     = (char*) lockedRect->pBits;
    size_t numRows = surface->h;
    size_t rowSize = surface->w * surface->format->BytesPerPixel;

    // for each row...
    while(numRows--)
    {
        // copy the row
        memcpy(dst, src, rowSize);

        // use the given pitch parameters to advance to the next
        // row (since these may not equal rowSize)
        src += surface->pitch;
        dst += lockedRect->Pitch;
    }

    // don't forget this, or D3D won't like you ;)
    hr = pTex->UnlockRect(0);
}
...