如何在没有d3dx9的情况下在DirectX 9中创建纹理?

时间:2013-04-23 14:51:12

标签: directx windows-store-apps

Windows 8商店不希望在我的应用中看到d3dx9,这是DirectX 9中写的。但我需要D3DXCreateTexture功能。我找到了DirectXTex,但它需要DirectX 11。有没有办法避免在DirectX 11中重写所有内容?

2 个答案:

答案 0 :(得分:3)

首先,您必须加载原始位图数据。有很多方法:

  • 编写自己的装载机(不是在21世纪oO)
  • 将库用于您需要的格式。比如libpng,libjpeg,更多关于Google =)
  • 使用多格式库(C/C++ Image Loading)。 FreeImage是我的最爱。

然后您必须通过IDirect3DTexture9D3DXCreateTextureFromFileInMemory创建D3DXCreateTextureFromFileInMemoryEx,然后您就可以开始了=)

<强>更新

好。我们无法使用D3DXCreateTextureFromFileInMemory。所以...我们可以实现它。 如前所述,我们必须以某种方式将位图加载到内存(我更喜欢使用FreeImage)。然后我们通过 IDirect3DTexture9* 方法创建 CreateTexture()。然后我们使用LockRect() / UnlockRect()将位图的内容复制到该纹理。那个时候我们准备好了,因为我已经测试过了! =)测试VS2012解决方案,包括FreeType:link(凌乱和脏,请重写它并包装在一个类中) 核心功能:

void CreateTexture(const wchar_t* filename)
{
unsigned int width(0), height(0);
std::vector<unsigned char> bitmap;
LoadBitmapFile(filename, bitmap, width, height); // Wrapped FreeImage

// Create empty IDirect3DTexture9*
pDevice->CreateTexture(width, height, 1, 0, 
                           D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, 0);
if (!pTexture)
{
    throw std::runtime_error( "CreateTexture failed");
}

D3DLOCKED_RECT rect;
pTexture->LockRect( 0, &rect, 0, D3DLOCK_DISCARD );
unsigned char* dest = static_cast<unsigned char*>(rect.pBits);
memcpy(dest, &bitmap[0], sizeof(unsigned char) * width * height * 4);
pTexture->UnlockRect(0);

}

希望它有所帮助。

P.S。实际上还有另一个问题:投影矩阵。您需要手动创建它或使用一些数学库,因为您不能使用D3DXMatrix ..()函数。

答案 1 :(得分:0)

似乎必须使用DirectX 9重写DirectX 11代码,因为DirectXTKDirectXTexDirectXMath libs仅适用于DX11。我在http://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/c082b208-0d95-4c41-852f-9450340093f4/

找到的更多信息