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:取得したデータにはサブリソースのポインタが含まれており、サブリソースへのアクセスを拒否しています.
Unmap:無効なポインタが指すリソースで、GPUのアクセスを再有効にします.
例:
この文書では、主にリソースの変更方法を説明します.
重要: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);
この文書では、主にリソースの変更方法を説明します.