c++ 如何使用assimp加载透明材质?

ekqde3dh  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(163)

我有一个简单的场景,有一面透明的墙和两个立方体。

Blender中透明墙的基础颜色设置为:RGBA = {0.8, 0.2, 0.6, 0.3}
我已经将场景导出为gltf,并使用assimp加载它。
我的材料提取代码看起来像这样(它可能有点混乱,因为我一直在寻找解决方案):

void ExtractMaterial(const aiScene* scene)
{
    std::unordered_map<std::string, std::string> customProperties;
    if (scene->HasMaterials()) {
        for (uint32_t i = 0; i < scene->mNumMaterials; i++) {
            auto aiMaterial = scene->mMaterials[i];
            auto aiMaterialName = aiMaterial->GetName();

            aiColor4D aiColor;
            if (aiMaterial->Get(AI_MATKEY_COLOR_DIFFUSE, aiColor) == AI_SUCCESS) {
                std::cout << std::endl;
            }

            float opacity = 1.0f;
            if (aiMaterial->Get(AI_MATKEY_OPACITY, opacity) == AI_SUCCESS) {
                std::cout << std::endl;
            }

            float transFac = 1.0f;
            if (aiMaterial->Get(AI_MATKEY_TRANSPARENCYFACTOR, transFac) == AI_SUCCESS) {
                std::cout << std::endl;
            }

            float transCol = 1.0f;
            if (aiMaterial->Get(AI_MATKEY_COLOR_TRANSPARENT, transCol) == AI_SUCCESS) {
                std::cout << std::endl;
            }

            for (int p = 0; p < aiMaterial->mNumProperties; p++) {
                aiMaterialProperty* pt = aiMaterial->mProperties[p];
                switch (pt->mType) {
                    case aiPTI_String: {
                        const char* data = pt->mData;
                        customProperties[pt->mKey.C_Str()] = data;
                    }
                    break;
                    case aiPTI_Float: {
                        std::stringstream ss;
                        ss << *(float*)pt->mData;
                        customProperties[pt->mKey.C_Str()] = ss.str();

                        if (strcmp(pt->mKey.C_Str(), "$mat.opacity") == 0) {
                            float num = *(float*)pt->mData;
                            if (num != 1.0) {
                                std::cout << std::endl;
                            }
                        }
                        else if (strcmp(pt->mKey.C_Str(), "$mat.gltf.alphaMode") == 0) {
                            float mode = *(float*)pt->mData;

                            std::cout << std::endl;
                        }
                    }
                    break;
                }
            }
        }
    }
}

我在写std::cout << std::endl;的地方设置了断点。std::cout << std::endl;是强制调试器在这些地方执行代码。
墙的aiColor4D aiColor;与Blender中的相同,除了alpha1.0f(应该是0.3f)。
剩下的变量opacitytransFactransColcustomPropertiesMap只是让我检查哪个是实际的alpha值。他们都不是。
如何获得墙的alpha值?
材质 * 应该 * 可以正常导出,因为默认的Windows 10 3D网格资源管理器可以正常使用它。

idfiyjo8

idfiyjo81#

您需要检查是否设置了AI_MATKEY_OPACITY。但也有可能我们有问题。我将检查它并为此创建一个新的bug报告。多谢提醒。

相关问题