2017-01-13 65 views
1

我非常新的Direct X 11,我想創建一個簡單的2D紋理(類型ID3D11Texture2D的)。我已閱讀關於CreateTexture2D的文檔,並且我明白:的DirectX 11 - 如何創建一個非常簡單的2D紋理

pDesc是我們如何定義圖像。

pInitialData包含字節數組呈現圖像紋理的每個像素

ppTexture2D是我們的結果 - 在2D紋理的DirectX 11

我想創建一個非常簡單的2D紋理:一個粉紅色的矩形。但我不知道如何創建粉紅色矩形的字節數組。 我有以下代碼:

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. 

非常感謝。

回答

3

假設你定義粉作爲RGB(255,174,201)這創造了一個1x1的粉紅色質地:

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! 
} 

我使用推薦的C++智能指針COM Microsoft::WRL::ComPtr在該代碼,而比難以確保正確參考計數的「原始」指針更爲重要。有關更多信息,請參見this page

當然,這不是通常你如何創建紋理。您通常使用的圖像文件,而且往往不是使用DDS文件具有紋理貼圖鏈,並使用專門的紋理壓縮格式。

How to: Initialize a Texture From a File MSDN上。

使用C++開始使用DirectX 11的好地方是DirectX Tool Kit for DirectX 11tutorials

+0

注意,創建單個像素的紋理可以是有用的通過有和無紋理着色器之間不區分以降低着色器的數量。 – Matthias