2017-01-13 6 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, которые имеют сети mipmap и используют специализированные форматы сжатия текстур.

См. How to: Initialize a Texture From a File на MSDN.

Хорошее место, чтобы начать с DirectX 11, с использованием C++ является DirectX Tool Kit for DirectX 11 и tutorials для него.

+0

Обратите внимание, что создание одиночных пиксельных текстур может быть полезно для уменьшения количества шейдеров, не дифференцируя шейдеры с текстурами и без них. – Matthias