1

我有点想知道这一点,如果您使用 CreateTexture 函数在 DirectX 中的内存中创建纹理:

HRESULT CreateTexture(
  UINT Width,
  UINT Height,
  UINT Levels,
  DWORD Usage,
  D3DFORMAT Format,
  D3DPOOL Pool,
  IDirect3DTexture9** ppTexture,
  HANDLE* pSharedHandle
);

...并以D3DFMT_UNKNOWN格式传递到底应该发生什么?如果我尝试获取第一层或第二层的表面会导致错误吗?会失败吗?图形设备会选择它选择的随机格式吗?这会导致不同显卡型号/品牌之间出现问题吗?

4

3 回答 3

2

我刚试了一下,它并没有失败,主要是

Usage设置为D3DUSAGE_RENDERTARGETor时,无论我对后台缓冲区格式或其他设置做了什么D3DUSAGE_DYNAMIC,它始终显示为。D3DFMT_A8R8G8B8不知道是不是和我的显卡有关。我的猜测是,指定未知意味着“为我挑选”,并且 32 位格式对我的卡来说最简单。

当用法为 时D3DUSAGE_DEPTHSTENCIL,它始终失败。

所以我最好的结论是,指定D3DFMT_UNKNOWN格式让 DirectX 可以选择它应该是什么。或者也许它总是默认为D3DFMT_A8R8G8B.

可悲的是,我无法在任何地方的任何文档中确认任何这一点。:|

于 2009-07-30T05:07:30.273 回答
0

我认为这属于“未定义”类别。一些驱动程序将无法分配,而其他驱动程序可能会默认设置。我从未在 WDK 中看到任何内容表明需要处理这种情况。我猜如果您启用调试 DX 运行时,您将看到一条错误消息。

于 2009-07-30T15:08:29.387 回答
0

MSDN没有说。但我很确定您会因此得到“D3DERR_INVALIDCALL”。

如果方法成功,则返回值为 D3D_OK。如果方法失败,返回值可以是以下之一:D3DERR_INVALIDCALL、D3DERR_OUTOFVIDEOMEMORY、E_OUTOFMEMORY。

于 2009-07-30T04:47:49.870 回答