2016-06-10 2 views
0

내 빌드 환경은 다음과 같습니다. Windows 8.0, SDK 및 C++를 사용하여 빌드 된 Windows 8.1, VS2012, 데스크톱 응용 프로그램.DXGI_FORMAT_YUY2 텍스처가 Windows 8.1 및 Windows 10에서 다른 RowPitch를 반환합니다.

내가 잘못 여기서 뭐하는 거지 윈도우 8.1 RowPitch 인쇄 2560 만 창 (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 = %d\n", mappedResource.RowPitch); 

    pDeviceContext->Unmap(pTexture2D, 0); 


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

    getchar(); 
    } 

답변

2

내가 잘못 여기서 뭐하는 거지?

이것은 반드시 잘못된 것은 아닙니다. RowPitch은 텍스처에 할당 된 하드웨어 및 드라이버 레이아웃에 따라 다릅니다. 음조가 다를 수 있습니다. 리소스가 매핑되면 피치를 다시 읽고 데이터를 읽거나 쓰는 데 각각 사용해야합니다.

피치 사용 코드에 대한 this thread and message를 참조하십시오

텍스처 리소스는 원본 데이터의 피치보다 아마 다른 자신의 피치 (행의 바이트 수)입니다해야합니다. 이 음조는 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; 
} 
+1

, 정말 중요하지 않습니다. 나는 이것을 플랫폼 팀과의 OS 차이점으로 지적했다. –

+0

이 게시물을 읽은 후 매핑 된 값을 사용했습니다. 그러나 웹캠의 YUY2 데이터를 텍스처 (Win10에서 행 피치를 두 배로 반환)로 복사 한 다음 픽셀 쉐이더를 사용하여 텍스처를 표시하려고하면 이미지의 내용이 전체적으로 나타나지만 반으로 만 채 웁니다. 사각형 영역 나는 그들을 표시합니다. 이것은 Windows 8.1에서 발생하지 않고 이미지가 올바르게 표시됩니다. 나는 덧씌우 기가 포함되어 있지만 두 번 덧씌우 기가 있다는 것을 이해합니다. –

+0

또한 https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx에 따르면 YUY2 텍스처의 데이터는 연속적이므로 내 이미지가 표시되어야합니다. 올바르게 수행 할 수 있습니다. Win 8.1 –