【发布时间】:2019-12-04 11:41:11
【问题描述】:
ID3D11Device::CreateTexture3D 适用于小于 4 GB 的纹理,但对于较大的尺寸,E_OUTOFMEMORY 会失败,即使有更多可用内存也是如此。为什么?
例如在具有 16 GB 显存的 NVIDIA Quadro P5000 上:
- DedicatedVideoMemory 为 16 GB。
- MaxVolumeExtent 是 2048。
- 所以我希望能够创建 Width=2000、Height=2000、Depth=2000、Format=
DXGI_FORMAT_R16_UINT(~15 GiB) 的纹理,但它失败了。 - Width=1024, Height=1024, Depth=2048, Format=
DXGI_FORMAT_R16_UINT(4 GB) 仍然失败。 - Width=1024,Height=1024,Depth=1024,Format=
DXGI_FORMAT_R16_UINT(2 GB) 有效。
其他 NVIDIA 卡(例如具有 8 GB 显存的 NVIDIA GeForce GTX 1070)具有相同的限制。
这是 D3D11 的已知限制吗? NVIDIA 驱动程序/卡?有什么办法可以让它发挥作用吗?
ID3D11Texture3D* texture = 0;
D3D11_TEXTURE3D_DESC texureDesc;
ZeroMemory(&volTexDesc, sizeof(texureDesc));
texureDesc.Width = 1024;
texureDesc.Height = 1024;
texureDesc.Depth = 2048;
texureDesc.MipLevels = 1;
texureDesc.Format = DXGI_FORMAT_R16_UINT;
texureDesc.Usage = D3D11_USAGE_DEFAULT;
texureDesc.BindFlags = 0;
texureDesc.CPUAccessFlags = 0;
texureDesc.MiscFlags = 0;
HRESULT result = d3dDevice->CreateTexture3D(&texureDesc, NULL, &texture);
(在具有 64 GB 系统内存的 64 位 OS / x64 目标中,没有其他东西正在运行并耗尽系统或视频内存。)
【问题讨论】: