我有一个简单的场景,有一面透明的墙和两个立方体。
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中的相同,除了alpha
是1.0f
(应该是0.3f
)。
剩下的变量opacity
,transFac
,transCol
和customProperties
Map只是让我检查哪个是实际的alpha值。他们都不是。
如何获得墙的alpha值?
材质 * 应该 * 可以正常导出,因为默认的Windows 10 3D网格资源管理器可以正常使用它。
1条答案
按热度按时间idfiyjo81#
您需要检查是否设置了AI_MATKEY_OPACITY。但也有可能我们有问题。我将检查它并为此创建一个新的bug报告。多谢提醒。