2017-06-12 5 views
0

Ich möchte die Größe eines D3D11Texture2D ändern, um es kleiner zu machen. Zum Beispiel habe ich eine Textur in 1920x1080 und ich möchte sie zum Beispiel 1280x720 skalieren. Nur damit Sie wissen, dass ich überhaupt nicht zeichne, möchte ich nur den Byte-Puffer skaliert bekommen. Hier ist mein Code:Größe ändern D3D11Texture2D DirectX 11

if (mRealTexture == nullptr) { 
     D3D11_TEXTURE2D_DESC description; 
     texture2D->GetDesc(&description); 
     description.BindFlags = 0; 
     description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
     description.Usage = D3D11_USAGE_STAGING; 
     description.MiscFlags = 0; 
     hr = mDevice->CreateTexture2D(&description, NULL, &mRealTexture); 
     if (FAILED(hr)) { 
      if (mRealTexture) { 
       mRealTexture->Release(); 
       mRealTexture = nullptr; 
      } 
      return NULL; 
     } 
    } 
    mImmediateContext->CopyResource(mRealTexture, texture2D); 

    if (mScaledTexture == nullptr) { 
     D3D11_TEXTURE2D_DESC description; 
     texture2D->GetDesc(&description); 
     description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
     description.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; 
     description.Width = 1440; 
     description.Height = 585; 
     description.MipLevels = 4; 
     description.ArraySize = 1; 
     description.SampleDesc.Count = 1; 
     description.SampleDesc.Quality = 0; 
     description.Usage = D3D11_USAGE_DEFAULT; 
     hr = mDevice->CreateTexture2D(&description, NULL, &mScaledTexture); 
     if (FAILED(hr)) { 
      if (mScaledTexture) { 
       mScaledTexture->Release(); 
       mScaledTexture = nullptr; 
      } 
      return NULL; 
     } 
    } //I want to copy the mRealTexture on the mScaledTexture, map the scaledTexture and get the buffer. 

Vielen Dank für Hilfe

+0

https://stackoverflow.com/a/24070486/8111865 könnte Ihnen helfen - es funktioniert nicht Code, sondern eine allgemeine Übersicht über die Größenänderung einer Ressource mit Direct2D und DXGI. – ozeanix

+0

Schade, es gibt keinen Beispielcode ... Ich denke, viele Leute müssen das tun ... Es ist zu vage, um die Schritte zu verstehen, die unternommen werden müssen. (In code ich meine) – DevAndroid

+0

Ich weiß, es klingt banal und ich meine es nicht so, aber versuchen Sie realistische Pseudocode für den Überblick zu schreiben und verwenden Sie die MSDN-Dokumentation für jede Schnittstelle, um es langsam in eine echte Umsetzung zu verwandeln. Arbeiten Sie zunächst mit kleinen Teilen und schauen Sie sich Ihre HRESULTs an. Ich habe festgestellt, dass die Arbeit mit DirectX und ähnlich strukturierten Dingen wie DirectShow und Media Foundation sehr frustrierend sein kann, aber es erfordert nur eine Investition von Zeit und Mühe, um es wirklich zu lernen. Sobald Sie das tun, werden Lösungen für solche Probleme sehr natürlich sein, da Sie eine Fülle von Kenntnissen darüber haben, was DirectX tun kann und wie Sie es tun. – ozeanix

Antwort

0

Nachdem darüber nachgedacht, und dass Sie links sind mit nur ein paar Optionen.

1 - Sie erstellen ein Ansichtsfenster usw. und rendern auf Ihre Zielgröße mit einem Vollbild-Quad. Ich habe das Gefühl, dass du das nicht willst.

2 - Sie rollen Ihre eigene Skalierung, die nicht zu schlecht ist und Textur skalieren, während Sie die Daten von einem Puffer zu einem anderen kopieren.

Option 2 ist nicht zu schlecht, die gröbste Skalierung würde das Lesen von Punkten basierend auf dem Skalierungsverhältnis sein, aber eine genauere Version würde eine Anzahl von Stichproben basierend auf einem gewichteten Gitter berechnen (die Gewichte müssen neu berechnet werden) für jedes Pixel, das Sie auf Ihrem Ziel besuchen.)

+0

Option 2 kann mit GDI + gemacht werden? Ich könnte den Pixel-Puffer auf eine Bitmap laden und dann skalieren? – DevAndroid

+0

Ich würde zustimmen, wenn es mehr um die Skalierung von Daten geht, dann könnte es besser sein, DX zu vermeiden. – ErnieDingo

Verwandte Themen