1

Windows 8 商店不想d3dx9在我的应用程序中看到,那是用DirectX 9. 但我需要D3DXCreateTexture功能。我被发现DirectXTex了,不过就是这样DirectX 11。有什么办法可以避免全部重写DirectX 11

4

2 回答 2

3

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

  • 编写你自己的加载器(不是在 21 世纪 oO)
  • 将库用于您需要的格式。比如 libpng、libjpeg,更多在 Google =)
  • 使用多格式库(C/C++ 图像加载)。FreeImage 是我的最爱。

然后你必须通过D3DXCreateTextureFromFileInMemoryD3DXCreateTextureFromFileInMemoryEx创建IDirect3DTexture9并且你准备好了 =)

更新:

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

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

}

希望能帮助到你。

PS 其实还有一个问题:投影矩阵。您将需要手动创建它或使用一些数学库,因为您无法使用 D3DXMatrix..() 函数。

于 2013-04-23T19:55:31.573 回答
-1

似乎DirectX 9代码必须用DirectX 11, cause DirectXTK,重写DirectXTexDirectXMathlibs 仅适用于 DX11。我在http://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/c082b208-0d95-4c41-852f-9450340093f4/找到了更多信息

于 2013-04-24T08:24:43.713 回答