0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

頂点ロックで個別に頂点制御をする際の変更箇所(DX9→DX11)

Last updated at Posted at 2019-03-17

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?