

提示コードの`///`コメント部内部のコードですが`Assimp`を使って`blender`で書きだしたモデルをロードしてマテリアルを読み込みテクスチャーのパスを読み込みたいのですが`mat->GetTextureCount()`を使ってテクスチャーの数を表示されるとどの種類のテクスチャを`０`になってしまいます。これはなぜでしょうか？提示画像の通りベースカラーを設定しているのですが。

参考サイトA：https://note.com/info_/n/n1dd54ce4545b

[![画像の説明をここに入力](https://i.stack.imgur.com/cEzuI.jpg)](https://i.stack.imgur.com/cEzuI.jpg)  
[![画像の説明をここに入力](https://i.stack.imgur.com/3Xu8v.jpg)](https://i.stack.imgur.com/3Xu8v.jpg)

##### コンソールログ

[code]

    ああああ
    0
    mat->GetTextureCount() 0
    mat->GetTextureCount() 0
    mat->GetTextureCount() 0
    mat->GetTextureCount() 0
    0
    
    0
    
    
    
[/code]

##### Resource.cpp

[code]

    /*############################################################################################
    # モデル　ロード
    ############################################################################################*/
    
    std::unique_ptr<FrameWork::Model> FrameWork::Resource::LoadModel(const std::string path)
    //std::shared_ptr<FrameWork::Model> FrameWork::Resource::LoadModel(const std::string path)
    {
        for (int i = 0; i < modelList.size(); i++)
        {
            if (modelList.at(i).getPath() == path)
            {
                return std::make_unique<Model>(modelList.at(i).getMesh(), modelList.at(i).getPath());
            }
        }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        std::cout << "ああああ" << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
        Assimp::Importer importer;
        const aiScene* scene = importer.ReadFile(path, aiProcess_CalcTangentSpace | aiProcess_Triangulate | aiProcess_JoinIdenticalVertices | aiProcess_SortByPType | aiProcess_Triangulate | aiProcess_FlipUVs);
        if (scene == nullptr)
        {
            std::cout << "ロード出来ません　" <<path << std::endl;
        }
        ProcessNode(scene->mRootNode, scene);   
        modelList.push_back(Model(meshes, path));
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        std::cout << "importer.GetErrorString() " << importer.GetErrorString() << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
        return std::make_unique<Model>(meshes, path);
    }
    
    /*############################################################################################
    # ノードのメッシュを取得
    ############################################################################################*/
    void FrameWork::Resource::ProcessNode(aiNode* node, const aiScene* scene)
    {
        for (unsigned int i = 0; i < node->mNumMeshes; i++)
        {
            aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
            meshes.push_back(ProcessMesh(mesh, scene));
        }
    
        for (unsigned int i = 0; i < node->mNumChildren; i++)
        {
            ProcessNode(node->mChildren[i], scene);
        }
    }
    
    /*############################################################################################
    # メッシュを取得
    ############################################################################################*/
    FrameWork::Mesh FrameWork::Resource::ProcessMesh(aiMesh* mesh, const aiScene* scene)
    {
        std::vector<VertexAttribute> vertices;
        std::vector<unsigned int> indices;
    
        std::vector<Texture> textures;
    
        for (unsigned int i = 0; i < mesh->mNumVertices; i++)
        {
            VertexAttribute vertex;
    
            vertex.position[0] = mesh->mVertices[i].x;
            vertex.position[1] = mesh->mVertices[i].y;
            vertex.position[2] = mesh->mVertices[i].z;
    
            //テクスチャ座標があるかどうか？
            if (mesh->mTextureCoords[0] != nullptr)
            {
                vertex.uv[0] = mesh->mTextureCoords[0][i].x;
                vertex.uv[1] = mesh->mTextureCoords[0][i].y;
            }
            else
            {
                vertex.uv[0] = 0.0f;
                vertex.uv[1] = 0.0f;
            }
    
            vertices.push_back(vertex);
        }
    
        //インデックス
        for (unsigned int i = 0; i < mesh->mNumFaces; i++)
        {
            aiFace face = mesh->mFaces[i];
            for (unsigned int j = 0; j < face.mNumIndices; j++)
            {
                indices.push_back(face.mIndices[j]);
            }
        }
    
    
        // process materials
        aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
        std::cout <<"mesh->mMaterialIndex "<< mesh->mMaterialIndex << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //ベースカラー
        std::vector<Texture> baseColor = LoadMaterialTextures(material, aiTextureType::aiTextureType_BASE_COLOR);
        textures.insert(textures.end(), baseColor.begin(), baseColor.end());
    
        std::cout << textures.size() << std::endl;
        return FrameWork::Mesh(vertices, indices, textures);
    }
    
    /*############################################################################################
    # メッシュのテクスチャをロード
    ############################################################################################*/
    std::vector<FrameWork::Texture> FrameWork::Resource::LoadMaterialTextures(aiMaterial* mat, aiTextureType type)
    {
        std::vector<FrameWork::Texture> textures;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_BASE_COLOR) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_AMBIENT) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_NONE) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_UNKNOWN) << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
        for(unsigned int i = 0; i < mat->GetTextureCount(type); i++)
        {
            aiString str;
            mat->GetTexture(type, i, &str);
    
            bool skip = false;
            for(unsigned int j = 0; j < textures_loaded.size(); j++)
            {
                if(std::strcmp(textures_loaded[j].getPath().data(), str.C_Str()) == 0)
                {
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    std::cout <<"str.C_Str() "<< str.C_Str() << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    textures.push_back(textures_loaded[j]);
                    skip = true;
                    break;
                }
            }
    
            if (skip == false)
            {
                FrameWork::Texture texture(LoadTexture(str.C_Str(),type));
                textures_loaded.push_back(texture);
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                std::cout << "texture path: " << str.C_Str() << std::endl;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            }
        }
    
        return textures;
    }
    
    
[/code]


CC BY-SA 4.0
2022-11-02T08:54:28.200
91947
2022-11-03T08:32:11.103
2022-11-02T09:17:47.353
55177
55177
question
opengl
openglでassimpを使ってマテリアル情報を取得できない原因が知りたい。


以下のように列挙体全体をループしたところ`aiTextureType::aiTextureType_DIFFUSE`のところで１という結果が返ってきたのでそもそもベースカラーのテクスチャではないということがわかりました。

##### 対処方法

diffuseテクスチャでした。

[code]

    for (int i = 0; i < 21; i++)
        {
            std::cout << "mat->GetTextureCount() " << mat->GetTextureCount((aiTextureType)i) << std::endl;
        }
    
    
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_DIFFUSE) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_BASE_COLOR) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_AMBIENT) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_NONE) << std::endl;
        std::cout << "mat->GetTextureCount() " << mat->GetTextureCount(aiTextureType::aiTextureType_UNKNOWN) << std::endl;
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    
[/code]


CC BY-SA 4.0
2022-11-03T08:32:11.103
91965
2022-11-03T08:32:11.103
55177
91947
answer