在 directx 11 中,当我创建顶点缓冲区时出现未处理的异常错误
In directx11 when I create vertexbuffer I have unhandled exception error
//change directory
_chdir("Models");
std::ifstream InFile;
InFile.open(strFilename);
if (!InFile)
{
MessageBox(0, L"file does not exist", 0, 0);
return 0;
}
char strCommand[256] = { 0 };
for (;;)
{
InFile >> strCommand;
if (!InFile)
break;
if (0 == strcmp(strCommand, "#"))
{
// Comment
}
else if (0 == strcmp(strCommand, "v"))
{
// Vertex Position
float x, y, z;
InFile >> x >> y >> z;
Positions->push_back(XMFLOAT3(x, y, z));
mVCount++;
}
else if (0 == strcmp(strCommand, "vt"))
{
// Vertex TexCoord
float u, v;
InFile >> u >> v;
TexCoords->push_back(XMFLOAT2(u, v));
mTCount++;
}
else if (0 == strcmp(strCommand, "vn"))
{
// Vertex Normal
float x, y, z;
InFile >> x >> y >> z;
Normals->push_back(XMFLOAT3(x, y, z));
mNCount++;
}
else if (0 == strcmp(strCommand, "f"))
{
// Face
UINT iPosition, iTexCoord, iNormal;
VERTEX::objVertex vertex;
for (UINT iFace = 0; iFace < 3; iFace++)
{
ZeroMemory(&vertex, sizeof(VERTEX::objVertex));
// OBJ format uses 1-based arrays
InFile >> iPosition;
vertex.position = (*Positions)[iPosition - 1];
/////////////////////////////////////////////////////////////
vIndices->push_back(iPosition - 1);
mICount++;
/////////////////////////////////////////////////////////////
if ('/' == InFile.peek())
{
InFile.ignore();
if ('/' != InFile.peek())
{
// Optional texture coordinate
InFile >> iTexCoord;
vertex.texcoord = (*TexCoords)[iTexCoord - 1];
}
if ('/' == InFile.peek())
{
InFile.ignore();
// Optional vertex normal
InFile >> iNormal;
vertex.normal = (*Normals)[iNormal - 1];
}
}
}
}
else
{
//skip without vertex
}
//InFile.ignore(1000, '\n');
}
InFile.close();
_chdir("..");
return S_OK;
这是我尝试从 .obj 文件加载几何图形的时候。
D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(VERTEX::objVertex) * mVCount;
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = Positions;
HR(Device->CreateBuffer(&vbd, &vinitData, &pmVB));
D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT)* mICount;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = vindices;
HR(Device->CreateBuffer(&ibd, &iinitData, &pmIB));
return S_OK;
这是我尝试创建缓冲区的时候。
当我尝试调试时,vs 在 HR() 函数中说未处理的异常。
我最多三天遇到这个问题,我不知道为什么会这样。请给我一些建议。
根据评论,解决方案有两个:
a) 将指针传递给 std::vector 是不正确的,因为 std::vector 的基础数据并不存在于该地址。
b) 更正后,在尝试初始化足以包含所有属性的顶点缓冲区时传递仅包含位置属性的数据将失败。 D3D 将尝试读取比 'initial data' 提供的更多的数据,这很可能是异常的原因。解决方案是为所有顶点的所有属性提供包含足够数据的初始数据。
//change directory
_chdir("Models");
std::ifstream InFile;
InFile.open(strFilename);
if (!InFile)
{
MessageBox(0, L"file does not exist", 0, 0);
return 0;
}
char strCommand[256] = { 0 };
for (;;)
{
InFile >> strCommand;
if (!InFile)
break;
if (0 == strcmp(strCommand, "#"))
{
// Comment
}
else if (0 == strcmp(strCommand, "v"))
{
// Vertex Position
float x, y, z;
InFile >> x >> y >> z;
Positions->push_back(XMFLOAT3(x, y, z));
mVCount++;
}
else if (0 == strcmp(strCommand, "vt"))
{
// Vertex TexCoord
float u, v;
InFile >> u >> v;
TexCoords->push_back(XMFLOAT2(u, v));
mTCount++;
}
else if (0 == strcmp(strCommand, "vn"))
{
// Vertex Normal
float x, y, z;
InFile >> x >> y >> z;
Normals->push_back(XMFLOAT3(x, y, z));
mNCount++;
}
else if (0 == strcmp(strCommand, "f"))
{
// Face
UINT iPosition, iTexCoord, iNormal;
VERTEX::objVertex vertex;
for (UINT iFace = 0; iFace < 3; iFace++)
{
ZeroMemory(&vertex, sizeof(VERTEX::objVertex));
// OBJ format uses 1-based arrays
InFile >> iPosition;
vertex.position = (*Positions)[iPosition - 1];
/////////////////////////////////////////////////////////////
vIndices->push_back(iPosition - 1);
mICount++;
/////////////////////////////////////////////////////////////
if ('/' == InFile.peek())
{
InFile.ignore();
if ('/' != InFile.peek())
{
// Optional texture coordinate
InFile >> iTexCoord;
vertex.texcoord = (*TexCoords)[iTexCoord - 1];
}
if ('/' == InFile.peek())
{
InFile.ignore();
// Optional vertex normal
InFile >> iNormal;
vertex.normal = (*Normals)[iNormal - 1];
}
}
}
}
else
{
//skip without vertex
}
//InFile.ignore(1000, '\n');
}
InFile.close();
_chdir("..");
return S_OK;
这是我尝试从 .obj 文件加载几何图形的时候。
D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(VERTEX::objVertex) * mVCount;
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = Positions;
HR(Device->CreateBuffer(&vbd, &vinitData, &pmVB));
D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT)* mICount;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = vindices;
HR(Device->CreateBuffer(&ibd, &iinitData, &pmIB));
return S_OK;
这是我尝试创建缓冲区的时候。 当我尝试调试时,vs 在 HR() 函数中说未处理的异常。 我最多三天遇到这个问题,我不知道为什么会这样。请给我一些建议。
根据评论,解决方案有两个:
a) 将指针传递给 std::vector 是不正确的,因为 std::vector 的基础数据并不存在于该地址。
b) 更正后,在尝试初始化足以包含所有属性的顶点缓冲区时传递仅包含位置属性的数据将失败。 D3D 将尝试读取比 'initial data' 提供的更多的数据,这很可能是异常的原因。解决方案是为所有顶点的所有属性提供包含足够数据的初始数据。