DirectX Assips間違ったテクスチャ座標 -- c++ フィールド と directx フィールド と textures フィールド と assimp フィールド 関連 問題

Directx Assimp Wrong Texture Coordinates












0
vote

問題

日本語

私はDirectXアプリにメッシュをロードしようとしています。メッシュが正常にロードできますが、メッシュの側面にテクスチャ座標が間違っています。 (側のみ。反対側のテクスチャは正しくマッピングされています) スクリーンショット

これが私のコードです。

model.h

<事前> <コード> #ifndef MODEL_H #define MODEL_H #include <vector> #include <d3d11_1.h> #include <DirectXMath.h> #include <D3DX10.h> #include <Importer.hpp> #include <scene.h> #include <postprocess.h> #include "Mesh.h" using namespace DirectX; class CModel { public: CModel(); ~CModel(); bool Load(HWND hwnd, ID3D11Device* dev, ID3D11DeviceContext* devcon, std::string filename); void Draw(ID3D11DeviceContext* devcon); void Close(); private: ID3D11Device *dev; ID3D11DeviceContext *devcon; std::vector<Mesh> meshes; string directory; vector<Texture> textures_loaded; HWND hwnd; void processNode(aiNode* node, const aiScene* scene); Mesh processMesh(aiMesh* mesh, const aiScene* scene); vector<Texture> loadMaterialTextures(aiMaterial* mat, aiTextureType type, string typeName, const aiScene* scene); string determineTextureType(const aiScene* scene, aiMaterial* mat); int getTextureIndex(aiString* str); ID3D11ShaderResourceView* getTextureFromModel(const aiScene* scene, int textureindex); }; #endif

model.cpp

<事前> <コード> System.Security.SecurityException: ECall methods must be packaged into a system module. 0

mesh.h(これはヘッダーのみクラスです)

<事前> <コード> System.Security.SecurityException: ECall methods must be packaged into a system module. 1

ありがとう。

英語

I'm trying to load a mesh into my directx app. I can successfully load any mesh but texture coordinates are wrong on a side of mesh. (Only a side. The other side's texture is mapped correctly) ScreenShot

Here's my code.

Model.h

#ifndef MODEL_H #define MODEL_H  #include <vector> #include <d3d11_1.h> #include <DirectXMath.h> #include <D3DX10.h>  #include <Importer.hpp> #include <scene.h> #include <postprocess.h>  #include "Mesh.h"  using namespace DirectX;  class CModel { public: CModel(); ~CModel();  bool Load(HWND hwnd, ID3D11Device* dev, ID3D11DeviceContext* devcon, std::string filename); void Draw(ID3D11DeviceContext* devcon);  void Close(); private: ID3D11Device *dev; ID3D11DeviceContext *devcon; std::vector<Mesh> meshes; string directory; vector<Texture> textures_loaded; HWND hwnd;  void processNode(aiNode* node, const aiScene* scene); Mesh processMesh(aiMesh* mesh, const aiScene* scene); vector<Texture> loadMaterialTextures(aiMaterial* mat, aiTextureType type, string typeName, const aiScene* scene); string determineTextureType(const aiScene* scene, aiMaterial* mat); int getTextureIndex(aiString* str); ID3D11ShaderResourceView* getTextureFromModel(const aiScene* scene, int textureindex); }; #endif 

Model.cpp

#include "Model.h"    CModel::CModel() { }   CModel::~CModel() { }  bool CModel::Load(HWND hwnd, ID3D11Device* dev, ID3D11DeviceContext* devcon,  std::string filename) { Assimp::Importer importer;  const aiScene* pScene = importer.ReadFile(filename,     aiProcess_Triangulate |     aiProcess_ConvertToLeftHanded |     aiProcess_FlipUVs);  if (pScene == NULL)     return false;  this->directory = filename.substr(0, filename.find_last_of('/'));  this->dev = dev; this->hwnd = hwnd;  processNode(pScene->mRootNode, pScene);  return true; }  void CModel::processNode(aiNode* node, const aiScene* scene) { for (UINT i = 0; i < node->mNumMeshes; i++) {     aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];     meshes.push_back(this->processMesh(mesh, scene)); }  for (UINT i = 0; i < node->mNumChildren; i++) {     this->processNode(node->mChildren[i], scene); }  }  string textype;  Mesh CModel::processMesh(aiMesh* mesh, const aiScene* scene) { // Data to fill vector<VERTEX> vertices; vector<DWORD> indices; vector<Texture> textures;  if (mesh->mMaterialIndex >= 0) {     aiMaterial* mat = scene->mMaterials[mesh->mMaterialIndex];      if(textype.empty()) textype = determineTextureType(scene, mat); }  // Walk through each of the mesh's vertices for (UINT i = 0; i < mesh->mNumVertices; i++) {     VERTEX vertex;      vertex.X = mesh->mVertices[i].x;     vertex.Y = mesh->mVertices[i].y;     vertex.Z = mesh->mVertices[i].z;      if (mesh->mTextureCoords[0])     {         vertex.TEXX = mesh->mTextureCoords[0][i].x;         vertex.TEXY = mesh->mTextureCoords[0][i].y;     }     else     {         vertex.TEXX = 0.0f;         vertex.TEXY = 0.0f;     }      vertices.push_back(vertex); }  for (UINT i = 0; i < mesh->mNumFaces; i++) {     aiFace face = mesh->mFaces[i];      for (UINT j = 0; j < face.mNumIndices; j++)         indices.push_back(face.mIndices[j]); }  if (mesh->mMaterialIndex >= 0) {     aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];      vector<Texture> diffuseMaps = this->loadMaterialTextures(material, aiTextureType_DIFFUSE, "texture_diffuse", scene);     textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());      //vector<Texture> specularMaps = this->loadMaterialTextures(material, aiTextureType_SPECULAR, "texture_specular");     //textures.insert(textures.end(), specularMaps.begin(), specularMaps.end()); }  return Mesh(dev, vertices, indices, textures); }  vector<Texture> CModel::loadMaterialTextures(aiMaterial* mat, aiTextureType  type, string typeName, const aiScene* scene) { vector<Texture> textures; for (UINT i = 0; i < mat->GetTextureCount(type); i++) {     aiString str;     mat->GetTexture(type, i, &str);     // Check if texture was loaded before and if so, continue to next iteration: skip loading a new texture     bool skip = false;     for (UINT j = 0; j < textures_loaded.size(); j++)     {         if (std::strcmp(textures_loaded[j].path.C_Str(), str.C_Str()) == 0)         {             textures.push_back(textures_loaded[j]);             skip = true; // A texture with the same filepath has already been loaded, continue to next one. (optimization)             break;         }     }     if (!skip)     {   // If texture hasn't been loaded already, load it         HRESULT hr;         Texture texture;         if (textype == "embedded compressed texture")         {             int textureindex = getTextureIndex(&str);             texture.texture = getTextureFromModel(scene, textureindex);         }         else         {             string filename = string(str.C_Str());             filename = directory + '/' + filename;             hr = D3DX11CreateShaderResourceViewFromFile(dev, filename.c_str(), nullptr, nullptr, &texture.texture, nullptr);             if (FAILED(hr))                 MessageBox(hwnd, "Texture couldn't be loaded", "Error!", MB_ICONERROR | MB_OK);         }         texture.type = typeName;         texture.path = str;         textures.push_back(texture);         this->textures_loaded.push_back(texture);  // Store it as texture loaded for entire model, to ensure we won't unnecesery load duplicate textures.     } } return textures; }   void CModel::Draw(ID3D11DeviceContext* devcon) { for (int i = 0; i < meshes.size(); i++) {     meshes[i].Draw(devcon); } }  void CModel::Close() { for (int i = 0; i < meshes.size(); i++) {     meshes[i].Close(); }  dev->Release(); }  string CModel::determineTextureType(const aiScene* scene, aiMaterial* mat) { aiString textypeStr; mat->GetTexture(aiTextureType_DIFFUSE, 0, &textypeStr); string textypeteststr = textypeStr.C_Str(); if (textypeteststr == "*0" || textypeteststr == "*1" || textypeteststr == "*2" || textypeteststr == "*3" || textypeteststr == "*4" || textypeteststr == "*5") {     if (scene->mTextures[0]->mHeight == 0)     {         return "embedded compressed texture";     }     else     {         return "embedded non-compressed texture";     } } if (textypeteststr.find('.') != string::npos) {     return "textures are on disk"; } }  int CModel::getTextureIndex(aiString* str) { string tistr; tistr = str->C_Str(); tistr = tistr.substr(1); return stoi(tistr); }  ID3D11ShaderResourceView * CModel::getTextureFromModel(const aiScene * scene, int textureindex) { HRESULT hr; ID3D11ShaderResourceView *texture;  int* size = reinterpret_cast<int*>(&scene->mTextures[textureindex]->mWidth);  hr = D3DX11CreateShaderResourceViewFromMemory(dev, reinterpret_cast<unsigned char*>(scene->mTextures[textureindex]->pcData), *size, nullptr, nullptr, &texture, nullptr); if (FAILED(hr))     MessageBox(hwnd, "Texture couldn't be created from memory!", "Error!", MB_ICONERROR | MB_OK);  return texture; } 

Mesh.h (This is a header only class)

#ifndef MESH_H #define MESH_H  #include <string> #include <fstream> #include <sstream> #include <iostream> #include <vector> using namespace std;  #include <vector> #include <d3d11_1.h> #include <DirectXMath.h> #include <D3DX11.h> #include <D3DX10.h> using namespace DirectX;  struct VERTEX { FLOAT X, Y, Z; D3DXCOLOR color; FLOAT TEXX, TEXY; };  struct Texture { string type; aiString path; ID3D11ShaderResourceView *texture; };  class Mesh { public: vector<VERTEX> vertices; vector<DWORD> indices; vector<Texture> textures; ID3D11Device *dev;  Mesh(ID3D11Device *dev,vector<VERTEX> vertices, vector<DWORD> indices, vector<Texture> textures) {     this->vertices = vertices;     this->indices = indices;     this->textures = textures;      this->dev = dev;      this->setupMesh(dev); }  void Draw(ID3D11DeviceContext *devcon) {     UINT stride = sizeof(VERTEX);     UINT offset = 0;      devcon->IASetVertexBuffers(0, 1, &VertexBuffer, &stride, &offset);     devcon->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);      devcon->PSSetShaderResources(0, 1, &textures[0].texture);      devcon->DrawIndexed(indices.size(), 0, 0); }  void Close() {     VertexBuffer->Release();     IndexBuffer->Release(); } private: /*  Render data  */ ID3D11Buffer *VertexBuffer, *IndexBuffer;  /*  Functions    */ // Initializes all the buffer objects/arrays bool setupMesh(ID3D11Device *dev) {     HRESULT hr;      D3D11_BUFFER_DESC vbd;     vbd.Usage = D3D11_USAGE_IMMUTABLE;     vbd.ByteWidth = sizeof(VERTEX) * vertices.size();     vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;     vbd.CPUAccessFlags = 0;     vbd.MiscFlags = 0;      D3D11_SUBRESOURCE_DATA initData;     initData.pSysMem = &vertices[0];      hr = dev->CreateBuffer(&vbd, &initData, &VertexBuffer);     if (FAILED(hr))         return false;      D3D11_BUFFER_DESC ibd;     ibd.Usage = D3D11_USAGE_IMMUTABLE;     ibd.ByteWidth = sizeof(DWORD) * indices.size();     ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;     ibd.CPUAccessFlags = 0;     ibd.MiscFlags = 0;      initData.pSysMem = &indices[0];      hr = dev->CreateBuffer(&ibd, &initData, &IndexBuffer);     if (FAILED(hr))         return false; } };  #endif 

Thanks.

</div
           
         
         

回答リスト

0
 
vote
vote
ベストアンサー
 

私はそれを解決しました。他の誰かがこの問題に直面しているなら、SamplerStateを設定したことを確認してください。

 

I solved it. If anyone else facing this issue be sure you have set a SamplerState.

</div
 
 

関連する質問

2  CMAKEとのアスパイム  ( Assimp with cmake ) 
私はCmakeを使って私のプロジェクトにアスピットを含めたいです。私はUbuntu 14.04 LTEとQtcreatorを持っています。 プロジェクトには、main.cppとlibsディレクトリに格納されているリンクライブラリーが含まれています。 メインCM...

0  DirectX、Assimp Model Loaderにはメッシュクラッシュがあります  ( Directx assimp model loader has mesh crash ) 
DirectX 11とASSIMP(VS C ++ 2012)によってコードされているモデルローダーに取り組んでいます。今すぐモデルファイルを正常にロードできますが、画像のように新しいエラーがあります。 http://i.imgur.com/1xlcqg9...

1  ASSIMPデモローディング3Dモデル  ( Assimp demo loading 3d model ) 
私は最初に3Dモデルをロードしてお試しください。この例は、Lighthouse3D エラーなしでコンパイルされます。ただし、POSTの下のコメントで説明したエラーJeffreyについても同様のエラーが発生しました。 <事前> <コード> PositionI...

0  C#(SharpDX)でAssimpnetを使用して3DSファイルから3Dモデルをロードする方法?  ( How to load 3d model from a 3ds file using assimpnet in c sharp sharpdx ) 
SharpDXを使ってC#に3DSファイルをロードして表示したい。 3DSファイルをロードするには、ツールの「ASSIMP」を見つけて、C# assimpnet 。< / P> Assimpnetを使用して3DSをロードする方法 Assimpnetで利用可...

3  LWJGLのASSIMPチュートリアル[クローズ]  ( Assimp tutorial for lwjgl ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

2  ルートから始めて、Assimp Bone階層を構築します  ( Construct assimp bone hierarchy beginning at the root ) 
Assimp.Netを使用して、アニメーションの.daeファイルを私のOpenTkエンジンにインポートし、使用可能な階層的な骨構造を確立するのに苦労しています。 real="nofollownoreferrer">チュートリアル私は、根の骨、または「関節」...

1  Jassimp - 扶養ライブラリを見つけることができません  ( Jassimp cant find dependent libraries ) 
Jassimp Library、プロジェクトでNetBeansでライブラリを使用しようとしています。 プロジェクトの「実行」オプションでNetBeansのライブラリパスを設定しています。 <コード> -Djava.library.path=D:VB201...

1  ASSIMP - ファイル形式を使用して、テクスチャを使用してメッシュをインポートしますか。  ( Assimp how do you import a mesh with textures using any file format ) 
メッシュをインポートするときは、素材を入手しますが、テクスチャのファイル名にアクセスできない。 .mtlファイルは、テクスチャのファイル名を明示的に表示します。コードでは、テクスチャ数が1ですが、ファイル名フィールドは空の文字列とFullPath出力 "* 0...

0  objmtlモデルをAssimpのエクスポートタイプに変換する方法  ( How to convert the objmtl models into export types in assimp ) 
objmtlモデルをどのようにJSONに変換することができます。モデルはObject.objファイルとObject.MTLファイルでここにあるべきだから、それらをどのように組み合わせてJSONに変換することができますか?? OBJモデルのみを変換するコマ...

3  strncasecmpとstrcasecmpは宣言されていません  ( Strncasecmp and strcasecmp has not been declared ) 
Code :: BlocksのMingWにアスピットをコンパイルしようとしていますが、次のエラーが発生します。 <事前> <コード> assimp-3.3.1assimp-3.3.1codeStringComparison.h||In function 'i...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有