From f14aba423899c4afdcf99fcdbbeefd129c3c493c Mon Sep 17 00:00:00 2001 From: atdunbg Date: Fri, 9 Oct 2026 00:12:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E8=87=AA=E5=8F=91=E5=85=89=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=EF=BC=9AglTF=20=E5=AF=BC=E5=85=A5=E7=AB=AF=E5=86=99?= =?UTF-8?q?=20emissiveFactor=EF=BC=88EMISSIVE=5FCOLOR=EF=BC=8C=E8=B4=B4?= =?UTF-8?q?=E5=9B=BE=E6=97=A0=20factor=20=E6=97=B6=E8=AE=BE=E7=99=BD?= =?UTF-8?q?=EF=BC=89=EF=BC=9BEmissive=20=E5=85=9C=E5=BA=95=E7=BA=B9?= =?UTF-8?q?=E7=90=86=E9=BB=91=E2=86=92=E7=99=BD=EF=BC=88=E9=BB=91=E5=85=9C?= =?UTF-8?q?=E5=BA=95=E4=BC=9A=E6=8A=8A=20factor/strength=20=E4=B8=80?= =?UTF-8?q?=E8=B5=B7=E4=B9=98=E6=B2=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Engine/src/Renderer/MaterialAsset.cpp | 7 ++++++- Engine/src/Renderer/Model.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Engine/src/Renderer/MaterialAsset.cpp b/Engine/src/Renderer/MaterialAsset.cpp index 775db08..f16d78a 100644 --- a/Engine/src/Renderer/MaterialAsset.cpp +++ b/Engine/src/Renderer/MaterialAsset.cpp @@ -29,7 +29,12 @@ namespace Engine return Texture::CreateSolidColor(device, allocator, 0, 128, 0, false); case Material::Emissive: - return Texture::CreateSolidColor(device, allocator, 0, 0, 0); + // 兜底白(非黑):emissive = 贴图 × factor × strength——黑 + // 兜底会把无贴图材质的 factor/strength 一起乘没(调了恒黑 + // 的困惑源);白兜底 = 无贴图时 factor 即发光色,有贴图时 + // glTF 语义不变(factor 黑的普通模型依旧不发光) + return Texture::CreateSolidColor(device, allocator, + 255, 255, 255); case Material::Ao: return Texture::CreateSolidColor(device, allocator, 255, 0, 0, false); diff --git a/Engine/src/Renderer/Model.cpp b/Engine/src/Renderer/Model.cpp index f77ec9d..65ca50d 100644 --- a/Engine/src/Renderer/Model.cpp +++ b/Engine/src/Renderer/Model.cpp @@ -899,6 +899,23 @@ ParsedMesh Model::ProcessMesh(const aiMesh* mesh, const aiScene* scene, static_cast(emissiveStrength), static_cast(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(emissiveColor.r), + static_cast(emissiveColor.g), + static_cast(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)——