【问题标题】:How to get texture channel ID from material in Assimp?如何从 Assimp 中的材质中获取纹理通道 ID?
【发布时间】:2016-12-28 01:46:29
【问题描述】:

我发现每个网格都有textureCoords,格式为textureCoords[i][j],其中“i”是顶点ID,“j”是纹理通道ID,表示使用了材质中的哪个特定纹理。

我知道我可以使用 material->GetTexture(aiTextureType_DIFFUSE, n, &texturePath) 找到网格使用的纹理,但是我如何获取 channelID 以及我对“j”保留为 channelID 的理解是否正确?

【问题讨论】:

    标签: 3d assimp


    【解决方案1】:

    您可以直接从材质中读取纹理路径。

    if(material->GetTextureCount(aiTextureType_DIFFUSE) > 0) {
        aiString path;
        material->GetTexture(aiTextureType_DIFFUSE, 0, &path);
        printf("Diffuse Texture: %s\n", path.data.c_str());
    }
    

    对于纹理坐标:

    if(aiM->mTextureCoords[0])
        for (int j = 0; j < aiM->mNumVertices; j++)
            vd.texCoord1 = Vector2(aiM->mTextureCoords[0][j].x, aiM->mTextureCoords[0][j].y);
    

    【讨论】:

    • 感谢您的回复。从您的示例中,我发现“i”保留在通道中,“j”保留在 vertexId(我教它是相反的)。但是我想问一件事:如果材质包含多个纹理,我如何找到哪个通道(或mTextureCoords[i][j] 中的“i”对应于材质中的特定纹理(因为材质最多可以包含 8 个纹理,然后“i”将在 0 到 7 的范围内,我不知道哪个“i”是与这 8 种纹理中的哪一种有关)
    • 通常具有不同纹理的网格将作为单独的网格存储在节点内。所以很可能你不必使用多个纹理坐标。唯一需要第二个纹理坐标通道的情况是使用光照贴图纹理,该纹理通常不使用与 defuse 纹理相同的坐标。
    【解决方案2】:

    您可以使用 AI_MATKEY_UVWSRC 获取纹理的通道 ID(如果已明确定义)。

    // gets channelID for 0th Diffuse texture
    int uvChannel = -1;
    if (aiReturn_SUCCESS == material->Get(AI_MATKEY_UVWSRC(aiTextureType::aiTextureType_DIFFUSE, 0), uvChannel)) {
        std::cout << "uvChannel: " << uvChannel << std::endl;
    } else {
        std::cout << "uvChannel: Not defined" << std::endl;
    }
    

    记录在“How to map UV channels to textures (MATKEY_UVWSRC)”。

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 2020-09-01
      • 2018-03-12
      • 2021-06-24
      • 2011-04-13
      • 2019-06-03
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多