动态向纹理写入内容

最近想向纹理写入内容,谁知死活都有问题,先说一下我自己的思路:
1.在创建的时候写入内容:

        int n = 512 * 512;
	UINT* textureData = new UINT[n];
	for(int i = 0;i<n;)
	{
		textureData[i] = 0xFF0000FF;
	}

	ID3D11Texture2D* texture2D;
	D3D11_TEXTURE2D_DESC Desc;
	ZeroMemory( &Desc, sizeof( D3D11_TEXTURE2D_DESC ) );
	Desc.Usage = D3D11_USAGE_DEFAULT;
	Desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
	Desc.Width = 512;
	Desc.Height = 512;
	Desc.ArraySize = 1;
	Desc.MipLevels = 1;
	Desc.SampleDesc.Count = 1;
	D3D11_SUBRESOURCE_DATA data;
	data.pSysMem = textureData;
	data.SysMemPitch = 512*4;// 每一行的跨度,字节长度
	data.SysMemSlicePitch = 0; // 深度 3D纹理有用
	device->CreateTexture2D( &Desc, &data, &texture2D);

最先想到的肯定是这种方式,因为buffer就是在创建的时候传递值的,但是这种方式1D的纹理写入的时候是可以正常创建的,2D的就不行。想到之前学习后缓冲时的一个概念,跨度 != 宽度,或许可以是这样原因。如果不是,还请各位指正。
2.使用UpdateSubresource更新内容,从参数上来看,它对纹理的支持貌似比Map要好一点,Map写纹理的时候不知道怎么用。

void UpdateSubresource(
  [in]  ID3D11Resource *pDstResource,
  [in]  UINT DstSubresource,
  [in]  const D3D11_BOX *pDstBox, // 这个用来描述,要覆盖目标的那个区域
  [in]  const void *pSrcData, // 数据源
  [in]  UINT SrcRowPitch, // 源的每行的跨度
  [in]  UINT SrcDepthPitch // 深度
);

从方法的参数来看,好像不用这个更新纹理的数据天理难容,但是写入的时候还是没有显示出正确的结果:

        int rowPitch = 512*4;
	D3D11_BOX box;
	box.left = 0;
	box.top = 0;
	box.right = 512;
	box.bottom = 512;
	box.front = 0;
	box.back = 0;
	deviceContext->UpdateSubresource(texture2D,0,&box,textureData,rowPitch,0);

3.第三个就是使用D3DX11CreateTextureFromMemory和D3DX11CreateTextureFromResource来创建,也没有创建出来。
另外,使用

D3DX11SaveTextureToFile(deviceContext,texture2D,D3DX11_IFF_BMP,L"h001000.bmp");

这个方法把纹理输出出来,来进行判定内容是否更新正确的,不知道是不是TextureToFile针对不同的Format 对输出的图像格式有特殊要求。

 

你可能感兴趣的:(动态)