2016-06-10 9 views
0

Meine Build-Umgebung ist wie folgt: Windows 8.1, VS2012, Desktop-Anwendung mit Windows 8.0 SDK und C++ gebaut.DXGI_FORMAT_YUY2 Texturen geben unterschiedliche RowPitch unter Windows 8.1 und Windows 10 zurück

Wenn ich mein Programm laufen auf Windows 8.1 die RowPitch druckt 2560 aber unter Windows 10 die gleichen Programm druckt 5120.

Was mache ich falsch hier?

Hier ist der Code, Danke für alle Antworten.

#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(); 
    } 

Antwort

2

Was mache ich hier falsch?

Dies ist nicht unbedingt falsch. RowPitch hängt vom Layout der Hardware und des Treibers ab, die für die Textur zugewiesen wurden. Die Tonhöhe kann variieren. Sie sollten die Tonhöhe zurücklesen, sobald die Ressource zugeordnet ist, und sie verwenden, um die Daten zu lesen oder zu schreiben.

Siehe this thread and message für Code-Schnipsel pitch:

Die Textur Ressource wird es eigene Tonhöhe (die Anzahl von Bytes in einer Reihe), die wahrscheinlich anders als die Tonhöhe Ihrer Quelldaten. Diese Tonhöhe erhalten Sie als "RowPitch" -Mitglied von D3D11_MAPPED_SUBRESOURCE. Also normalerweise tun Sie etwas wie folgt aus:

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

Wie bereits erwähnt, ist es nicht wirklich wichtig, weil Sie die zurückgegebenen abgebildeten Werte verwenden soll. Ich habe dies als einen Unterschied zwischen Betriebssystem und Plattform-Team bemerkt. –

+0

Nach dem Lesen dieses Beitrags habe ich die zugeordneten Werte verwendet. Wenn ich jedoch meine YUY2-Daten von einer Webcam in die Textur (die die doppelte Tonhöhe auf Win10 zurückgibt) kopiere, versuche diese Textur mit dem Pixel-Shader anzuzeigen, der Inhalt des Bildes erscheint in seiner Gesamtheit, füllt aber nur die Hälfte rechteckigen Bereich ich zeige sie an. Dies geschieht nicht unter Windows 8.1, das Bild wird korrekt angezeigt. Ich verstehe, dass Padding beteiligt ist, aber zweimal die Polsterung? –

+0

Auch gemäß https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx sollen die Daten in einer YUY2-Textur zusammenhängend sein, so dass mein Bild angezeigt werden muss korrekt wie es auf Win 8.1 –