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

5

我对DirectX 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个回答

9

假设你将粉色定义为 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++智能指针Microsoft::WRL::ComPtr,而不是使用更难确保正确引用计数的“原始”指针。请参阅此页面了解更多信息。
当然,这通常不是创建纹理的方式。通常使用图像文件,并且更经常使用具有mipmap链和使用专门的纹理压缩格式的DDS文件。
请参阅MSDN上的如何:从文件初始化纹理
使用C ++进行DirectX 11的好地方是DirectX Tool Kit for DirectX 11以及其教程

2
请注意,创建单像素纹理可以通过不区分具有和没有纹理的着色器来减少着色器数量。 - Matthias
1
嗯,这对我很有用,但我是色盲,所以那个像素是白色的哈哈..但无论如何...我建议想要手动设置R、G、B、A值的人可以像这样做。下面是一个50%透明的黄色正方形。const int RED = 255; const int GREEN = 255; const int BLUE = 0; const int ALPHA = 127;const uint32_t s_pixel = RED | (GREEN << 8) | (BLUE << 16) | (ALPHA << 24); - Jeremy Trifilo
请注意,DirectXMath 包含DirectXColors.h头文件,其中提供了所有 .NET Colors 在 sRGB-colorspace 中的值。您可以使用 XMColorSRGBToRGB 将这些常量转换为 线性颜色空间 - Chuck Walbourn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接