DXGI_FORMAT_YUY2纹理在 Windows 8.1 和 Windows 10 下返回不同的 RowPitch
DXGI_FORMAT_YUY2 textures return different RowPitch under Windows 8.1 and Windows 10
我的构建环境如下: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; }
相关文章:
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 几个 Nt 函数在 Windows 7 x32 上返回STATUS_WAIT_0
- 尝试在 Windows 上重定向 stdout 和 stderr——_fileno(stdout) 返回 -2
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- Qt5 哈希函数在 Windows 7 和 Windows10 上不会返回相同的哈希
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- C++ 即使数据可用,Windows recv() 也不会返回
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- C++ Windows 返回与退出进程
- repopenKeyex在Windows 8.1上返回2
- Windows句柄始终返回Invalid_handle_value
- 检查Windows激活状态返回错误的值
- 没有返回类型的静态函数可以通过Windows上的编译,但不能传递Linux上的编译
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- Windows HANDLE RAII 管理,如果返回布尔值而不是句柄怎么办?
- 为什么 CoCreateInstance 在某些 Windows 上返回REGDB_E_CLASSNOTREG?
- FCGX_GetParam REQUEST_METHOD可以在Windows中使用,但在Linux中返回NULL
- 创建 CTime @ 2am 不会返回正确的值(Windows CE,C++)
- C++ OpenGL glCreateProgram 在 Windows 上返回 0