DirectX9以降での頂点ロックのやり方を調べると
初回の頂点を全て用意しそれを使い、バッファをロックしmemcpyでコピーして作成と
いう記事が多いです。初期化処理では、この方法で問題ないですが、
作成後に更新時に個別に頂点の操作をしたい場合、Lock,Unlockで変更したい頂点に
だけアクセスをできると便利です。
DX9においてはその記事が割と見つかるので簡単です。
ですがDX11等でその方法の日本語記事がすくなかったのでまとめてみました。
まずは構造体を用意します(今回は共通)
struct D3DVECTEX
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
};
DX9ではこのように作成して頂点制御します
HRESULT DX9CreateVertexBuffer(LPDIRECT3DDEVICE9 pDevice)
{
LPDIRECT3DVERTEXBUFFER9 pVB= nullptr;
int vertexNum = 3
if (FAILED(pDevice->CreateVertexBuffer( vertexNum*sizeof(D3DVERTEX), 0,D3DFVF_VERTEX,D3DPOOL_DEFAULT,&pVB,NULL)))
{
return E_FAIL;
}
D3DVERTEX* pVerteices = nullptr;
//頂点をロック
if (FAILED(pVB->Lock(0,0,(void**)&pVerteices ,0)))
{
return E_FAIL;
}
//頂点アクセス
pVerteices[0].position= D3DXVECTOR3( 0.0f ,-0.50f, 1.0f );
pVerteices[0].normal= D3DXVECTOR3( 0.0f ,0.0f, 1.0f );
pVerteices[1].position= D3DXVECTOR3( 0.0f ,0.50f, 1.0f );
pVerteices[1].normal= D3DXVECTOR3( 0.0f ,0.0f, 1.0f );
pVerteices[2].position= D3DXVECTOR3( 1.0f ,-0.50f, 0.0f );
pVerteices[2].normal= D3DXVECTOR3( 1.0f ,0.0f, 0.0f );
//頂点をアンロック
pVB->Unlock();
return S_OK;
}
DX11等では次のようにします。
HRESULT DX11CreateVertexBuffer(ID3D11Device* pDevice,ID3D11DeviceContext* pDeviceContext)
{
ID3D11Buffer* pVB = nullptr;
D3DVERTEX verteces[3];
//バッファ作成
const D3D11_BUFFER_DESC BD = { sizeof(D3DVERTEX)*3,
D3D11_USAGE_DYNAMIC, D3D11_BIND_VERTEX_BUFFER,D3D11_CPU_ACCESS_WRITE, 0, 0 };
void* d = &verteces[0];
const D3D11_SUBRESOURCE_DATA p = { d, 0, 0 };
if(FAILED(pDevice->CreateBuffer(&BD, &p, &pVB))
{
return E_FAIL;
}
//頂点をロック
D3D11_MAPPED_SUBRESOURCE msr;
if(FAILED(pDeviceContext->Map(pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &msr))
{
return E_FAIL;
}
D3DVERTEX* pVerteices = (D3DVERTEX*)msr.pData;
//頂点アクセス
pVerteices [0].position= D3DXVECTOR3( 0.0f ,-0.50f, 1.0f );
pVerteices [0].normal= D3DXVECTOR3( 0.0f ,0.0f, 1.0f );
pVerteices [1].position= D3DXVECTOR3( 0.0f ,0.50f, 1.0f );
pVerteices [1].normal= D3DXVECTOR3( 0.0f ,0.0f, 1.0f );
pVerteices [2].position= D3DXVECTOR3( 1.0f ,-0.50f, 0.0f );
pVerteices [2].normal= D3DXVECTOR3( 1.0f ,0.0f, 0.0f );
//頂点をアンロック
pDeviceContext->Unmap(pVB, 0);
return S_OK;
}
↑2020/5/30追記 このコードは統合型グラフィックスGPUでしか
動作しない可能性があることがわかりました。詳しくは下記記事に記載をしています
https://qiita.com/bregade/items/23376885d2e4189888aa