IDL_Surface到IDirect3DTexture

时间:2010-04-10 13:46:08

标签: directx sdl direct3d textures

任何人都可以帮助将SDL_Surface对象(从文件加载的纹理)转换为IDirect3DTexture9对象。

1 个答案:

答案 0 :(得分:1)

老实说,我不知道你为什么要这样做。由于各种原因,这听起来像是一个真正可怕的想法,所以请告诉我们你为什么要这样做,这样我们才能说服你不要;)。

同时,快速概述一下你如何去做:

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