2017-01-13 6 views
1

Ich bin sehr neu in Direct X 11. Ich möchte eine einfache 2D-Textur (vom Typ ID3D11Texture2D) erstellen. Ich habe das Dokument über CreateTexture2D gelesen und ich verstehe, dass:DirectX 11 - So erstellen Sie eine sehr einfache 2D-Textur

pDesc ​​ ist, wie wir das Bild definieren.

pInitialData das Array von Bytes enthält

jedes Pixel des Bildes Textur präsentiert

ppTexture2D ist unser Ergebnis - die 2D-Textur für DirectX 11.

ich eine sehr einfache 2D-Textur erstellt werden soll : ein rosa Rechteck. Aber ich weiß nicht, wie man das Array von Bytes für das rosa Rechteck erstellt. Ich habe den Code unten:

D3D11_TEXTURE2D_DESC Desc; 
D3D11_SUBRESOURCE_DATA InitialData; 
ID3D11Texture2D*  pTexture2D; 

Desc.Usage = D3D11_USAGE_DEFAULT; 

BYTE* array;//How to have an array of Pink rectangle? 

InitialData.pSysMem = array; 
InitialData.SysMemPitch = 0; 
InitialData.SysMemSlicePitch = 0; 

m_device->CreateTexture2D(&Desc, &InitialData, &pTexture2D);//ID3D11Device m_device has been created before. 

Thank you very much.

Antwort

3

Angenommen, Sie rosa als RGB definieren (255, 174, 201), das schafft eine 1x1 rosa Textur:

ComPtr<ID3D11ShaderResourceView> texSRV; 
{ 
    static const uint32_t s_pixel = 0xffc99aff; 

    D3D11_SUBRESOURCE_DATA initData = { &s_pixel, sizeof(uint32_t), 0 }; 

    D3D11_TEXTURE2D_DESC desc = {}; 
    desc.Width = desc.Height = desc.MipLevels = desc.ArraySize = 1; 
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
    desc.SampleDesc.Count = 1; 
    desc.Usage = D3D11_USAGE_IMMUTABLE; 
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 

    ComPtr<ID3D11Texture2D> tex; 
    HRESULT hr = mDevice->CreateTexture2D(&desc, &initData, tex.GetAddressOf()); 

    if (SUCCEEDED(hr)) 
    { 
     D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; 
     SRVDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
     SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; 
     SRVDesc.Texture2D.MipLevels = 1; 

     hr = mDevice->CreateShaderResourceView(tex.Get(), 
      &SRVDesc, texSRV.GetAddressOf()); 
    } 

    if (FAILED(hr)) 
     // error! 
} 

Ich bin mit dem empfohlenen C++ Smart-Pointer für COM Microsoft::WRL::ComPtr in diesem Code eher als "rohe" Zeiger, die schwieriger sind, korrekte Referenzzählungen zu gewährleisten. Siehe this page für mehr.

Natürlich ist das nicht typisch, wie Sie Texturen erstellen. Sie verwenden normalerweise Bilddateien und verwenden häufig DDS Dateien mit Mipmap-Ketten und speziellen Texturkomprimierungsformaten.

Siehe How to: Initialize a Texture From a File auf MSDN.

Ein guter Ort, um mit DirectX starten 11 C++ verwendet, ist DirectX Tool Kit for DirectX 11 und die tutorials dafür.

+0

Beachten Sie, dass das Erstellen von einzelnen Pixel-Texturen nützlich sein kann, um die Anzahl der Shader zu verringern, indem Sie nicht zwischen Shadern mit und ohne Texturen unterscheiden. – Matthias