DX 11レンダーパイプ:データの修正(MapとUnmap)データのへんこう

2057 ワード

C++とHlslでCbufferデータをバインドすると、エラーが発生しやすくなります.エラーの根本的な原因は、C++によるデータ構造メモリの割り当てがhlslと異なることです.
重要:HLSLの構造体structは実はあなたが1つの変数であろうと、いくつかの変数であろうと、それは一度に1つのfloat 4のメモリの長さをいっぱいにして、どれだけの変数が1つのfloat 4の中に詰めて、いっぱいになってから次のfloat 4を詰めます.テストの結果、cbufferの長さはfloat 4の整数倍でなければならない.float+float 3の組み合わせが正常にデータを取得できるかどうかは分からないし、float+float+float 3+float 3の組み合わせが正常にデータに割り当てられるかどうかは分からない.GPUのメモリ割り当て規則にかかっている.
 
レンダリングパイプに入った後、CPUがbufferまたは他のタイプのデータを変更する場合、bufferを再newすることはできません.この場合,すでにパイプに入っているデータを修正できるメカニズムが必要であり,このメカニズムがMapとUnmapメカニズムである.その本質は,データのロックによりGPUが修正できなくなり,CPUが修正し,修正が完了すると元に戻すことである.
 
Map:取得したデータにはサブリソースのポインタが含まれており、サブリソースへのアクセスを拒否しています.
HRESULT Map(
  ID3D11Resource *pResource,  //       ,    buffer,   map        。
  UINT Subresource,  //       
  D3D11_MAP MapType, //         :D3D11_MAP_WRITE_DISCARD,D3D11_MAP_WRITE_NO_OVERWRITE
  UINT MapFlags, //       ,  
  D3D11_MAPPED_SUBRESOURCE *pMappedResource //      
);

typedef struct D3D11_MAPPED_SUBRESOURCE { 
  void *pData; //             
  UINT RowPitch; //          
  UINT DepthPitch; //      ,         
} D3D11_MAPPED_SUBRESOURCE;

Unmap:無効なポインタが指すリソースで、GPUのアクセスを再有効にします.
 
void Unmap(
  ID3D11Resource *pResource,
  UINT Subresource
);

例:
 
        m_immediateContext->Map(matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);

	//   const buffer  .
	dataPtr = (TransitionMatrix*)mappedResource.pData;

	//   transform  .
	D3DXMATRIX worldMatrix;
	D3DXMatrixIdentity(&worldMatrix);
	Matrix4 transform = D3DXMatrix2Matrix4(worldMatrix) * cameraManager->getView() * cameraManager->getPerspective();//D3DXMatrix2Matrix4(viewMatrix)  cameraManager->getView()
	dataPtr->transform = transform.Transpose(); //       

	m_immediateContext->Unmap(matrixBuffer, 0);

この文書では、主にリソースの変更方法を説明します.