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



我对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. 

谢谢。

假设您将粉红色定义为 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!
}

我在此代码中使用推荐的 COM C++智能指针进行 COM Microsoft::WRL::ComPtr,而不是更难确保正确引用计数的"原始"指针。请参阅此页面了解更多信息。

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

请参见如何:从 MSDN 上的文件初始化纹理。

使用 C++ 开始使用 DirectX 11 的一个

好地方是 DirectX 11 的 DirectX 工具包及其教程。

最新更新