修自发光回归:glTF 导入端写 emissiveFactor(EMISSIVE_COLOR,贴图无 factor 时设白);Emissive 兜底纹理黑→白(黑兜底会把 factor/strength 一起乘没)

This commit is contained in:
2026-10-09 00:12:35 +08:00
parent 6447b5c0fa
commit f14aba4238
2 changed files with 23 additions and 1 deletions
+17
View File
@@ -899,6 +899,23 @@ ParsedMesh Model::ProcessMesh(const aiMesh* mesh, const aiScene* scene,
static_cast<f32>(emissiveStrength),
static_cast<f32>(thickness));
// glTF emissiveFactor → assimp EMISSION_COLOR。非黑直接写;
// 有 emissive 贴图但 factor 黑的导出器(factor 缺省不写)按
// glTF 惯例设白——贴图语义就是"贴图即发光强度分布",乘 0
// 会把本来正常的自发光整个吃掉
aiColor3D emissiveColor(0.0f, 0.0f, 0.0f);
material->Get(AI_MATKEY_COLOR_EMISSIVE, emissiveColor);
if (emissiveColor.r > 0.0f || emissiveColor.g > 0.0f ||
emissiveColor.b > 0.0f) {
params.emissiveFactor = glm::vec4(
static_cast<f32>(emissiveColor.r),
static_cast<f32>(emissiveColor.g),
static_cast<f32>(emissiveColor.b), 0.0f);
}
else if (!texPaths[Material::Emissive].empty()) {
params.emissiveFactor = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f);
}
// transmission > 0 的材质必须走透明队列:物理透射表面要采样
// 不透明场景副本做折射。Khronos 新式玻璃写法是 alphaMode=OPAQUE
// + transmission=1(透明度语义全在 transmission,alpha 恒 1)——