2016-09-15 99 views
0

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

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

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

想知道我怎么可以使用这个结构由一个单独的文件上传的纹理数据在我的Direct X基于旋转的立方体文件。

回答

0

你没有提及数据是什么格式,这对了解如何做到这一点很重要,但我们假设你的text_Data指向一组R8G8B8A8数据(即每个像素是32位,每个8位)红色,绿色,蓝色和阿尔法从LSB到MSB的顺序)。如果是这样,它看起来像:

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)) 
    ... 

注意这是覆盖在MSDN中How to use Direct3D 11主题,虽然样本代码风格有一点点过时。

请特别看看DirectX Tool Kit for DirectX 11tutorials。没有理由编写自己的加载程序,只需要DDSTextureLoaderWICTextureLoader