使用DirectX更新帧缓冲区纹理数据

时间:2016-09-15 16:55:21

标签: visual-c++ directx textures directx-11 hololens

我正在VC ++中尝试使用VS 2015中的Direct X 11模板。我在用: D3D11_MAPPED_SUBRESOURCE 资源和MAP以及更新纹理的UNMAP。 现在,我的项目中有一个单独的文件,我正在读取像素,需要将其上传到此纹理。

我使用结构来保存纹理数据:

struct Frames{
int text_Width;
int text_height;
unsigned int text_Sz;
unsigned char* text_Data; };

想知道如何在单独的文件中使用此结构来在基于Direct X的Spinning Cube文件中上传纹理数据。

1 个答案:

答案 0 :(得分:0)

您没有提到数据的格式,这对于了解如何执行此操作至关重要,但我们假设您的text_Data指向R8G8B8A8数据的数组(即每个像素为32位,8位)按从LSB到MSB的顺序对每个红色,绿色,蓝色和Alpha进行比特)。如果是这样,它看起来像:

Frames f = ...; // your structure 

D3D11_TEXTURE2D_DESC desc = {};
desc.Width = UINT(f.text_Width);
desc.Height = UINT(f.text_height);
desc.MipLevels = desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA initData = {};
initData.pSysMem = f.text_Data;
initData.SysMemPitch = UINT( 4 * f.text_width );
initData.SysMemSlicePitch = UINT( text_Sz );

Microsoft::WRL::ComPtr<ID3D11Texture2D> pTexture;
HRESULT hr = d3dDevice->CreateTexture2D( &desc, &initData, &pTexture );
if (FAILED(hr))
    ...

请注意,How to use Direct3D 11主题在MSDN中对此进行了介绍,尽管示例代码样式有点过时。

  

特别注意DirectX Tool Kit for DirectX 11tutorials。只有DDSTextureLoaderWICTextureLoader时,没有理由编写自己的加载程序。