我试图利用一个简单的.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函数。
答案 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);