C++ 如何正确读取OBJ文件中的信息并使用它来使用DirectX 11渲染模型
我正在尝试用DirectX以OBJ文件格式渲染模型。我使用的是简单的立方体模型,但我得到了一些非常奇怪的结果(下图) 我曾尝试通过手动填充顶点数组来渲染立方体,效果非常好。在研究了OBJ文件格式之后,我认为我应该做类似的事情,但我不明白为什么这样做不起作用C++ 如何正确读取OBJ文件中的信息并使用它来使用DirectX 11渲染模型,c++,directx,.obj,C++,Directx,.obj,我正在尝试用DirectX以OBJ文件格式渲染模型。我使用的是简单的立方体模型,但我得到了一些非常奇怪的结果(下图) 我曾尝试通过手动填充顶点数组来渲染立方体,效果非常好。在研究了OBJ文件格式之后,我认为我应该做类似的事情,但我不明白为什么这样做不起作用 发送两个函数和结构描述: 初始化几何体 在这个函数中,我设置了几何体、着色器并从文件中读取信息。我认为我在这个函数的末尾做了一些错误的事情,因为我没有更改着色器部分和初始化部分,只是添加了填充顶点数组的新方法 渲染 这个函数与我的第一个版本
发送两个函数和结构描述:
在这个函数中,我设置了几何体、着色器并从文件中读取信息。我认为我在这个函数的末尾做了一些错误的事情,因为我没有更改着色器部分和初始化部分,只是添加了填充顶点数组的新方法
这个函数与我的第一个版本没有任何改变,在那个版本中,我手动填充了一个Vertexies数组
只是一些结构描述
HRESULT RenderDevice::initGeometry(){
///////从文件中读取信息//////////
ifstream*inp=新的ifstream(“test.obj”);
ofstream*out=新的ofstream(“result.txt”);
char-str[256];
而(!inp->eof()){
inp->getline(str,256);
meshInfo.coord.push_back(新的std::string(str));
}
HRESULT hr=S_正常;
ID3DBlob*pVSBlob=NULL;
hr=compileShaderFromFile(L“texture.fx”、“VS”、“VS_4_0”和pVSBlob);
如果(失败(小时)){
MessageBox(NULL,L“无法编译顶点着色器”,L“错误”,MB_OK);
返回人力资源;
}
hr=g_pd3dDevice->CreateVertexShader(pVSBlob->GetBufferPointer(),pVSBlob->GetBufferSize(),NULL,&g_pVertexShader);
如果(失败(小时)){
pVSBlob->Release();
返回人力资源;
}
D3D11输入元素描述布局[]={
{“位置”,0,DXGI_格式_R32G32B32_浮点,0,0,D3D11_输入_逐顶点_数据,0},
{“正常”,0,DXGI_格式_R32G32B32_浮点,0,12,D3D11_输入_逐顶点_数据,0}
};
UINT NUMELEMENTES=阵列化(布局);
hr=g_pd3dDevice->CreateInputLayout(布局、Numelements、pVSBlob->GetBufferPointer()、pVSBlob->GetBufferSize()、和g_pVertexLayout);
pVSBlob->Release();
如果(失败(小时)){
返回人力资源;
}
g_pimediatecontext->IASetInputLayout(g_pVertexLayout);
ID3DBlob*pPSBlob=NULL;
hr=compileShaderFromFile(L“texture.fx”、“PS”、“PS\u 4\u 0”和&pPSBlob);
如果(失败(小时)){
MessageBox(NULL,L“无法编译像素着色器”,L“错误”,MB_OK);
返回人力资源;
}
hr=g_pd3dDevice->CreatePixelShader(pPSBlob->GetBufferPointer(),pPSBlob->GetBufferSize(),NULL,&g_pPixelShader);
pPSBlob->Release();
如果(失败(小时)){
返回人力资源;
}
pPSBlob=NULL;
hr=compileShaderFromFile(L“texture.fx”、“PSSolid”、“ps_4_0”和&pPSBlob);
如果(失败(小时)){
MessageBox(NULL,L“无法编译实体像素着色器”,L“错误”,MB_OK);
返回人力资源;
}
hr=g_pd3dDevice->CreatePixelShader(pPSBlob->GetBufferPointer(),pPSBlob->GetBufferSize(),NULL,&g_pPixelShaderSolid);
pPSBlob->Release();
如果(失败(小时)){
返回人力资源;
}
/////////将信息拆分为不同的向量/////////////////
对于(int i=0;ic_str()[0]='v'&&meshInfo.coord[i]->c_str()[1]!='n'){
浮动tmpx、tmpy、tmpz;
sscanf_s(meshInfo.coord[i]>c_str(),“v%f%f”,&tmpx,&tmpy,&tmpz);
meshInfo.positions.push_back(XMFLOAT3(tmpx,tmpy,tmpz));
}else if(meshInfo.coord[i]>c_str()[0]='v'&&meshInfo.coord[i]>c_str()[1]='n'){
浮动tmpx、tmpy、tmpz;
sscanf_s(meshInfo.coord[i]>c_str(),“vn%f%f”,&tmpx,&tmpy,&tmpz);
meshInfo.normals.push_back(XMFLOAT3(tmpx,tmpy,tmpz));
}else if(meshInfo.coord[i]>c_str()[0]=='f'){
int iX、iY、iZ、nX、nY、nZ;
sscanf_s(meshInfo.coord[i]>c_str(),“f%d/%d%d//%d%d//%d”,&iX、&nX、&iY、&nY、&iZ、&nZ);
meshInfo.indexiesPoints.push_back(iX);
meshInfo.indexiesPoints.push_back(iY);
meshInfo.indexiesPoints.push_back(iZ);
meshInfo.indexiesNormals.push_back(nX);
meshInfo.indexiesNormals.push_back(纽约);
meshInfo.indexiesNormals.push_back(新西兰);
}
}
meshInfo.indexiesAmount=meshInfo.indexiesPoints.size();
meshInfo.vertexAmount=meshInfo.positions.size();
meshInfo.normalsAmount=meshInfo.normals.size();
顶点*顶点=新顶点[meshInfo.indexiesAmount];
//////////////填充顶点数组///////////////
对于(int i=0;iCreateBuffer(&bd,&initData,&g_pVertexBuffer);
如果(失败(小时)){
返回人力资源;
}
///////////////////填充缺陷数组///////////////////
WORD*indexies=新词[meshInfo.indexiesaunt];
对于(int i=0;ifor (int i = 0; i < meshInfo.indexiesAmount; i++) {
indixies[i] = meshInfo.indexiesPoints[i] - 1;
}