Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确读取OBJ文件中的信息并使用它来使用DirectX 11渲染模型_C++_Directx_.obj - Fatal编程技术网

C++ 如何正确读取OBJ文件中的信息并使用它来使用DirectX 11渲染模型

C++ 如何正确读取OBJ文件中的信息并使用它来使用DirectX 11渲染模型,c++,directx,.obj,C++,Directx,.obj,我正在尝试用DirectX以OBJ文件格式渲染模型。我使用的是简单的立方体模型,但我得到了一些非常奇怪的结果(下图) 我曾尝试通过手动填充顶点数组来渲染立方体,效果非常好。在研究了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;
    }