まるくんの趣味プログラミング日記

最初はUnityを使っていたんだけど、業務から離れてしまったので、ゲーム/エミュレーターよろずについて書いていきます。

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

私はここ数ヶ月の間、DirectX11に地獄のように理不尽な目に逢わされています。 需要は少ないと思いますが、自ら踏んだ地雷をここに貼っていきます。

DirectX11 Bad Knouhow: VertexBuffer / IndexBuffer ...

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しないと、何故かたまに落ちます。 理由はわかりませんが、これで動いているのでまぁよしとしましょう。