任何人都可以帮助将SDL_Surface对象(从文件加载的纹理)转换为IDirect3DTexture9对象。
答案 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);
}