DXGI_FORMAT_YUY2纹理在 Windows 8.1 和 Windows 10 下返回不同的 RowPitch

DXGI_FORMAT_YUY2 textures return different RowPitch under Windows 8.1 and Windows 10

本文关键字:Windows 返回 RowPitch YUY2 FORMAT 纹理 DXGI      更新时间:2023-10-16

我的构建环境如下:Windows 8.1,VS2012,使用Windows 8.0 SDK和C++构建的桌面应用程序。

当我在 Windows 8.1 上运行我的程序时,RowPitch 打印 2560,但在 Windows 10 下,同一程序打印 5120。

我在这里做错了什么?

这是代码,感谢您的所有回复。

#include <d3d11.h>
static bool init_directx11(ID3D11Device **pDevice, ID3D11DeviceContext **pDeviceContext)
{
    D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_1};
    D3D_FEATURE_LEVEL featureLevel;
    UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
    HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, pDevice,
                                   &featureLevel, pDeviceContext);
    return SUCCEEDED(hr);
}
int _tmain(int argc, _TCHAR* argv[])
{
    ID3D11Device *pDevice = nullptr;
    ID3D11DeviceContext *pDeviceContext= nullptr;
    if (!init_directx11(&pDevice, &pDeviceContext))
    {
        return FALSE;
    }
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC));
    desc.ArraySize = 1;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    desc.Format = DXGI_FORMAT_YUY2;
    desc.MipLevels = 1;
    desc.MiscFlags = 0;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.Usage = D3D11_USAGE_DYNAMIC;
    desc.Width = 1280;
    desc.Height = 720;
    ID3D11Texture2D* pTexture2D = nullptr;
    HRESULT hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture2D);
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    ZeroMemory(&mappedResource, sizeof(DXGI_MAPPED_RECT));
    hr = pDeviceContext->Map(pTexture2D, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
    printf("RowPitch = %dn", mappedResource.RowPitch);
    pDeviceContext->Unmap(pTexture2D, 0);

    pTexture2D->Release();
    pDeviceContext->Release();
    pDevice->Release();
    getchar();
   }

我在这里做错了什么?

这不一定是错的。 RowPitch取决于为纹理分配的硬件和驱动程序的布局。音调可能会有所不同。您应该在映射资源后读回音调,并分别使用它来读取或写入数据。

请参阅此线程和消息以获取音高使用代码片段:

纹理资源将具有自己的音高(一行中的字节数),这可能与源数据的音高不同。这个音高是作为D3D11_MAPPED_SUBRESOURCE的"RowPitch"成员给你的。所以通常你会做这样的事情:

BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData);
for(UINT i = 0; i < height; ++i)
{
  memcpy(mappedData, buffer, rowspan);
  mappedData += mappedResource.RowPitch;
  buffer += rowspan;
}