在DirectX9中使用加载的.raw图像数据作为IDirect3DTexture9纹理?

时间:2013-12-28 21:48:17

标签: directx directx-9

我试图利用一个简单的.raw加载器作为一种简单的方法将图像加载到程序中,以便用作DirectX9的纹理。

我遇到的问题是D3DX功能完全不可用,我也无法在任何地方找到它们。我已经构建了自己的矩阵例程,但是没有一些指针就不能使用D3DX Texture文件函数。

我已经完成了我的作业,所以我想我需要的是使用CreateTexture函数和一些代码将我的unsigned char图像与IDirect3DTexture9 * DXTexture结合起来。

IDirect3DTexture9 *DXTexture;

unsigned char texture;
loadRawImage(&texture, "tex", 128, 128);

g_pD3DDevice->CreateTexture(128,128,0,D3DUSAGE_DYNAMIC,D3DFMT_A8R8G8B8,
                                               D3DPOOL_DEFAULT, &DXTexture,NULL);

//code required here to marry my unsigned char image with DXTexture

g_pD3DDevice->SetTexture(0, texture);

我看过这个页面,看起来有点像我需要的......

http://www.gamedev.net/topic/567044-problem-loading-image-data-into-idirect3dtexture9/

IDirect3DTexture9* tempTexture = 0;
HRESULT hr = device->CreateTexture(this->width,this,>height,0,D3DUSAGE_DYNAMIC,
                                D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,&tempTexture,0);

//assignment pointer
D3DCOLOR *Ptr;
unsigned char *tempPtr = 0; // increment pointer
int count = 0; //index into color data


//lock texture and get ptr
D3DLOCKED_RECT rect;
hr = tempTexture->LockRect(0,&rect,0,D3DLOCK_DISCARD);
tempPtr = (unsigned char*)rect.pBits; // assign to unsigned char 
                                          // pointer to make pointer arithmetic 
                                          // smooth
for(unsigned int i = 0; i < this->height; i++)
{

    tempPtr += rect.Pitch;  //move to next line in texture
    Ptr = (D3DCOLOR*)tempPtr;
    for(unsigned int j = 0; j < this->width; j++)
    {
        Ptr[j] = D3DCOLOR_XRGB(this->imageData[count++],
                                           this->imageData[count++],
                                           this->imageData[count++]);
    }

}


tempTexture->UnlockRect(0);

任何指针都将不胜感激。这是一个小型演示,因此代码保持在最低限度。

编辑以回应丢弃

基本上我的问题是如何将加载的.raw图像数据用作DirectX9纹理?我知道必须有一些内部字节格式,其中安排了IDirectTexture9纹理,我只需要一些关于如何将我的数据转换为这种格式的指针。这不使用D3DX函数。

1 个答案:

答案 0 :(得分:0)

尝试使用以下方法

   D3DLOCKED_RECT rect;
   ppTexture->LockRect( 0, &rect, 0, D3DLOCK_DISCARD );
   unsigned char* dest = static_cast<unsigned char*>(rect.pBits);
   memcpy(dest, &pBitmapData[0], sizeof(unsigned char) * biWidth * biHeight * 4);
   ppTexture->UnlockRect(0);