DirectX 11 - 如何创建一个非常简单的2D纹理

时间:2017-01-13 04:19:13

标签: c++ directx-11 texture2d

我是Direct X 11的新手。我想创建一个简单的2d纹理(ID3D11Texture2D类型)。我已阅读有关CreateTexture2D的文件,我理解:

pDesc 是我们定义图片的方式。

pInitialData 包含呈现图像纹理的每个像素的字节数组

ppTexture2D 是我们的结果--DirectX 11的2D纹理。

我想创建一个非常简单的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. 

非常感谢。

1 个答案:

答案 0 :(得分:5)

假设您将粉红色定义为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而不是“原始”#39;指针更难以确保正确的引用计数。有关详情,请参阅this page

当然,这通常不是如何创建纹理的。您通常使用图像文件,并且通常使用具有mipmap链的DDS文件并使用专门的纹理压缩格式。

请参阅MSDN上的How to: Initialize a Texture From a File

  

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