我是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的粉红色纹理:
ComPtrtexSRV; { 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 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! }
我
Microsoft::WRL::ComPtr
在此代码中为COM使用了推荐的C ++智能指针,而不是“原始”指针,后者很难确保正确的引用计数。有关更多信息,请参见此页面。
当然,通常这不是创建纹理的方式。通常,您使用图像文件,并且经常使用DDS
具有mipmap链并使用专用纹理压缩格式的文件。
请参阅如何:从 MSDN上的文件初始化纹理。
使用C ++从DirectX 11开始的一个好地方是DirectX 11的DirectX工具套件及其教程。