我是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.
非常感谢。
答案 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 11和tutorials。