LoginSignup
3
0

More than 5 years have passed since last update.

DirectX11バッドノウハウ 頂点バッファとインデックスバッファ

Posted at

DirectX11で地雷を踏みまくったので、自ら踏んだ地雷をここに貼っていきます。

    ID3D11Buffer*           m_pVertexBuffer;
    ID3D11Buffer*           m_pIndexBuffer;

    //
    D3D11_MAPPED_SUBRESOURCE msr = {};
    HRESULT hr;

    // vertices upload
    hr = m_context->Map(m_pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &msr);

    if (FAILED(hr))
        return;

    memcpy_s(msr.pData, sizeof(vtx_buf), vtx_buf, msr.RowPitch); // 頂点コピー msr.RowPitchで全体を書き換えないとまれに落ちる
    m_context->Unmap(m_pVertexBuffer, 0);

    // indices upload
    D3D11_MAPPED_SUBRESOURCE ires = {};
    hr = m_context->Map(m_pIndexBuffer 0, D3D11_MAP_WRITE_DISCARD, 0, &ires);
    if (FAILED(hr))
        return;

    void* idxbuf = ires.pData;
    if (idxbuf) {
//      memcpy(idxbuf, idc_buf, sizeof(uint32_t) * m_idc_cnt);          // 書き換えたインデックス数のコピーだとまれに落ちる
        memcpy_s(idxbuf, sizeof(idc_buf), idc_buf, ires.RowPitch);      // msr.RowPitchで全体を書き換えないと落ちる
        m_context->Unmap(m_pIndexBuffer, 0);
    }

VertexBufferとかIndexBufferをメインメモリからGPUメモリに転送するとき、何故かmemcpy関数の中で落ちるという、不可解な現象が起きました。 最初は書き換えたサイズだけ転送していたのですが、どうやらそれが原因だったみたい。

// indices upload
    D3D11_MAPPED_SUBRESOURCE ires = {};
    hr = m_context->Map(m_pIndexBuffer 0, D3D11_MAP_WRITE_DISCARD, 0, &ires);
    if (FAILED(hr))
        return;

    void* idxbuf = ires.pData;
    if (idxbuf) {
//      memcpy(idxbuf, idc_buf, sizeof(uint32_t) * m_idc_cnt);          // 書き換えたインデックス数のコピーだとまれに落ちる
        memcpy_s(idxbuf, sizeof(idc_buf), idc_buf, ires.RowPitch);      // msr.RowPitchで全体を書き換えないと落ちる
        m_context->Unmap(m_pIndexBuffer, 0);
    }

MapしたときのRowPitchのサイズでmemcpyしないと、何故かたまに落ちます。 理由はわかりませんが、これで動いているのでまぁよしとしましょう。

3
0
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
3
0