初始化D3DBuffer时访问冲突

时间:2015-11-15 10:33:16

标签: c++11 graphics directx-11

我正在尝试加载一个充满顶点的obj文件并将其渲染为点云。 当我尝试运行我的代码时崩溃并给我以下错误: Tutorial06.exe中0x66463E50(nvwgf2um.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00E9D000。

我按照微软提供的教程代码与DirectX进行了更改,并将其更改为适应我的布局和一切,但我必须做错了,我不确定它是什么。 这是我尝试初始化缓冲区的方法:

CloudLoader::getInstance().loadCloudData("cloud.obj");
std::vector<CloudVertex>* data = CloudLoader::getInstance().getCloudData();


D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof( CloudVertex ) * data->size();
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData, sizeof(InitData) );
InitData.pSysMem = data;
hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );

这是我的云加载代码:

void CloudLoader::loadCloudData(std::string fileName)
{
    if (m_loaded == false){
        m_loadedData = new std::vector<CloudVertex>();
        std::wifstream fileIn(fileName.c_str());    //Open file
        wchar_t checkChar;
        if (fileIn){
            while (fileIn){
                checkChar = fileIn.get();   //Get next char

                switch (checkChar){
                case 'v':
                    checkChar = fileIn.get();
                    if (checkChar == ' ')   //v - vert position
                    {
                        float vz, vy, vx;
                        fileIn >> vx >> vy >> vz;   //Store the next three types
                        m_loadedData->push_back(CloudVertex(vx, vy, vz));
                    }
                    break;
                }
            }
        }
    }
    m_loaded = true;
}

我猜它是一个C ++的东西,而不是directX,它可能非常简单,但我已经坚持了一段时间了,我真的很感激帮助。

1 个答案:

答案 0 :(得分:0)

pSysMem不能指向“数据”,因为这是指向std :: vector类的指针,实际上并不是向量中包含的数据。

尝试:

InitData.pSysMem = data->data();