对于某些纹理高度,ID3DDevice::CreateTexture2D 以 NV12 格式失败 E_INVALIDARG

ID3DDevice::CreateTexture2D fails with E_INVALIDARG in NV12 format for certain texture heights

我有以下纹理描述:

D3D11_TEXTURE2D_DESC texDesc = {};
texDesc.Width = 1920;
texDesc.Height = 953;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_NV12;
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.CPUAccessFlags = 0;
texDesc.Usage = D3D11_USAGE_DEFAULT;
texDesc.BindFlags = (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE);
texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;

我想使用 ID3D11Device::CreateTexture2D:

的描述来创建纹理
HRESULT hr = _pDevice->CreateTexture2D(&texDesc, 0, _ppTexOutput);

根据给出的描述,hr 始终是 E_INVALIDARG。 但是如果 texDesc.Height 设置为,例如 954,这一切都有效。如果 texDesc.Format 设置为 DXGI_FORMAT_B8G8R8A8_UNORM.

,那么对于每个值,纹理都会成功创建

是不是 DXGI_FORMAT_NV12 格式不支持某些纹理 heights/widths?我应该只使用除以 2 的高度吗?还是这背后有更复杂的规则?

是的,该格式要求宽度和高度都是偶数。请参阅 here 以供参考。它明确表示对于格式 DXGI_FORMAT_NV12:

Width and height must be even.

如果您像 Simon Mourier 在评论中所说的那样启用了调试层,您就会知道这一点。我强烈建议您启用它,因为它使在 DirectX 中进行调试变得容易得多。