AI 图片眼镜反光对不上场景

生成的人像戴眼镜,镜片里反着窗户、天空或者根本不存在的环境。讲讲 diffusion 模型为啥会瞎编反光、最快的修法,2026 年 6 月已核实。

你生成了一张棚拍人像。黑色背景、单灯柔光箱、人物戴眼镜。整张图都挺好看,直到你看到镜片:一边镜片里反着一个像窗户的东西带日光;另一边镜片反着完全不同的场景——可能是书架、可能是树。哪个都跟实际渲出来的环境对不上,两边镜片互相也对不上,照片的真实感瞬间崩掉。同样的问题还会出现在水面、镜子、抛光金属、甚至瞳孔 catchlight 上。

最快的修法: base 出图之后,用同一个选区把两个镜片一起蒙住(别分开蒙),denoise 0.5 inpaint,prompt 里明说你要的反光、并禁掉窗户——比如 both lenses showing the same soft studio reflection, no window。这一步能让两个镜片协调起来、把”窗户” prior 干掉,比在第一遍出图时改 prompt 靠谱得多。下面是详细步骤和完整判断流程。

这是模型在一个具体的物理约束上翻车:反光必须是场景内容的某种变换,而且左右成对的反光面要一致。Diffusion 模型不建模光线传播——它只是 pattern-match 训练集里”眼镜反光通常长什么样”,而训练集里全是窗户和柔光箱。截至 2026 年 6 月,连最强的前沿模型也只是近似做到这点:GPT Image 2 仍然过不了著名的 “Rubik’s Cube mirror reflection”(魔方镜面反射)空间测试,FLUX.2 有时会在该显示人物背面的镜子里渲出正面。所以把它当成一个要去管理的问题,而不是哪个现成模型能彻底解决的问题。

你属于哪一类

症状最可能的原因看这里
两个镜片反不同的场景镜片各采各的原因 1,修法 Step 5
反着你没要的窗户/天空训练 prior 盖过 prompt原因 2 和 4,修法 Step 1-2
大形状听 prompt、镜片不听小区域上 guidance 太低原因 3,修法 Step 3
细小圆框/细框,反光糊成一团镜片面积太小渲不动原因 5,修法 Step 5-6
upscale 之后反光变了upscaler 瞎编内容原因 6,修法 Step 7
眼镜是出完图后加的inpaint 没有场景上下文原因 7,看预防

常见原因

1. 模型对反光面没有场景一致性 prior

Diffusion 模型每块区域是半独立渲染的。左镜片和右镜片是从同一个 latent 出来但没有显式约束说要反同一个东西。训练集里眼镜带窗户反光的图特别多,每个镜片就独立地采样”这里可能是什么反光”。

怎么判断:把图其他部分挡住,只看两个镜片。如果像是从两张不同照片里抠出来的,那就是各采各的。

2. 背景 prompt 和反光 prompt 互相矛盾

你 prompt 写的是 “studio backdrop, seamless black, dramatic lighting”。但模型见过的”戴眼镜的人”图里带窗户反光的远远多于带黑棚反光的,prior 直接盖过 prompt。

怎么判断:反光内容是训练集里常见的东西(窗户、天空、树),跟你 prompt 里要求的场景没关系。

3. guidance 太低——prompt 在小区域上没被强制执行

在经典 CFG 模型上(SD 1.5、SDXL),CFG 3-5 这种低值,模型在镜片这种小细节区域上更依赖 prior。大形状听 prompt,小反光面不听。注意不同模型家族的 guidance 数值不一样(截至 2026 年 6 月):SDXL 一般在 CFG 5-8;Stable Diffusion 3.5 官方推荐的 guidance 大约是 4.5,再往上会”deep frying”(过曝的肤色、夸张的高光——反而可能让镜片眩光更糟);FLUX 是 guidance-distilled,FLUX-dev 的 guidance 3-4 大致等于老 CFG 7,FLUX.2 distilled 则要 CFG 1.0-1.5 配 ~4 步。用你这个模型对应的标尺,别死守一个 “7”。

怎么判断:SDXL 上把 CFG 从 5 往 7 推,反光更可控但大形状会变硬。FLUX/SD 3.5 上,拉高 guidance 只会让整图更亮更脆,反光内容并不会被修好。

4. 没有显式给反光内容的 token

你写了 “wearing glasses” 但根本没说镜片里应该反什么。模型就用统计平均填补——日光窗户。

怎么判断:你的 prompt 里压根没有 “reflection” 或 “lens” 相关的内容描述。

5. 框型让镜片太小渲不动一个 coherent 场景

圆形 John-Lennon 框或者细长方框,1024x1024 下每个镜片只有 20-40 像素。没空间渲一个 coherent 的反光场景,就退回到”反正亮一点”。

怎么判断:同样设置下飞行员框或大框就 OK,小框翻车。

6. upscaler 在镜片区域瞎编了新东西

base 出图镜片反光其实还挺中性。然后 upscaler——尤其 denoise > 0.3 的 AI upscaler——在第二 pass 里凭空发明了全新的反光内容。

怎么判断:对比 base 输出和 upscale 输出。镜片区域内容如果实质性变了,就是 upscaler 干的。

7. 眼镜是后期 inpaint 加上去的

你生成的时候是没戴眼镜的人像,后面 inpaint 把眼镜加上去。Inpaint 对周围场景的上下文了解更少,特别容易凭空发明窗户反光。

怎么判断:工作流里有一个单独的”加眼镜 inpaint”步骤。

最短修复路径

Step 1: 显式加反光内容的 token

# 不要只写 "wearing glasses"
wearing glasses, lens reflections show studio softbox,
matching catchlights in eyes and lenses, no window reflection

通过明说你要什么 + 不要什么,把 prior 从”窗户”那边拉走。

Step 2: 在 negative 里加强力的反光内容否定

negative: window reflection in glasses, sky in lenses,
trees reflected in glasses, mismatched lens reflections,
double reflection

这种具体 negative 比泛泛的好用得多。

Step 3: 按你的模型调 guidance(别一律”设成 7”)

SDXL / SD 1.5 上把 CFG 从 57,guidance 高一点能让反光内容 token 在小区域上落地;如果整图在 CFG 7 太硬,那就 CFG 保持 7 但把 hires fix 的 denoise 降低。SD 3.5 上保持在推荐的 4.5 附近——再往上会”deep fry”整图、放大镜片眩光,所以靠 prompt 和 inpaint 修反光,别靠拉 guidance。FLUX-dev 上把 guidance 拉到 ~4 是等效操作(大致对应老 CFG 7);FLUX.2 distilled 上 CFG 保持 1.0-1.5、改成加步数,然后靠 Step 5 修反光。FLUX 用 Euler 采样器配 Simple scheduler;Euler Ancestral 收敛不干净。

Step 4: 用 depth control 或 reference image 锁场景

给一张 depth map 或者简单的 reference image 表示你的棚拍布置(比如柔光箱在相机左侧),模型就有真实的几何参考可以反进镜片里。

controlnet: depth, weight 0.7, end_step 0.6
reference: studio_setup_diagram.png

SDXL/SD 3.5 上这是标准的 ControlNet-Depth pass。FLUX 上 depth 处理方式不一样——FLUX.1-Depth-dev 是一个微调出来的 depth 模型,不是 ControlNet 插件,所以要把它当模型加载(或者用 FLUX 兼容的 depth ControlNet,比如 InstantX/Shakker-Labs 那几个),别用 SDXL 的 ControlNet 节点。

Step 5: 用同一个 mask 一起 inpaint 两个镜片

base 出完图,两个镜片用同一个 mask 一起蒙住(不是分别!),denoise 0.5 inpaint,prompt 强调反光一致:

both lenses showing the same soft studio reflection,
symmetric subtle highlight from above, no window,
no separate scene per lens

两个一起蒙 + prompt 写”两个镜片反同一个东西”是收益最大的一步。

Step 6: 终稿手动盖掉乱反光

客户活儿就别死磕了,PS 里 30 秒——克隆图章把一个干净镜片盖到乱的那个上面——比再生一轮稳得多。模型出 90%,剩下手动。

Step 7: 如果用 upscaler,镜片区域降低 denoise

如果你的工作流支持 region-specific denoise(比如 Ultimate SD Upscale 配 mask),把镜片区域 denoise 设成 0.15 而不是 0.4。少发明、多保留。

怎么确认修好了

发图之前跑这三个检查:

  1. 裁切对比。 把两个镜片单独裁出来并排放。它们应该读起来是同一个场景从略微不同的角度反出来的——颜色一致、光线方向一致——而不是两张不同照片。
  2. catchlight 对位。 每个镜片里的亮高光应该和眼睛里的 catchlight、皮肤上的高光在同一侧(主灯在相机左侧,就会让所有反光面的高光落在人物的右侧)。catchlight 位置对不上是观众真正会注意到的破绽。
  3. 没有幽灵内容。 放到 100%(小框放 200%)看。不应该有场景里压根不存在的窗框、天空渐变或者树形。如果这些是 upscale 之后才冒出来的,那就是原因 6——重做 Step 7。

这些情况不是你的锅

SD 1.5 和 SDXL base 基本不懂几何反光,哪怕 prompt 写得完美,你得到的也只是”看起来合理”但物理上不对的结果。2026 年的前沿模型明显好一些,但仍然不完美:截至 2026 年 6 月,GPT Image 2 过不了标准的 “Rubik’s Cube mirror reflection”(魔方镜面反射)空间推理测试,FLUX.2 会在镜子里渲出人物错误的一侧。所以如果项目要求物理正确的反光(商业、产品图、任何会被放到 100% 看的东西),别硬磕模型——用 3D 渲染或者把反光合成进去。

另外人眼对眼镜反光特别敏感(我们天天看戴眼镜的人脸)。你觉得明显错的东西大多数观众根本不会注意——挑战要值得。

容易被误诊成

“眼睛位置不对”——瞳孔 catchlight 坏了看着很像镜片反光坏了,但修法不一样。瞳孔 catchlight 响应”光线方向” token;镜片反光响应”内容” token。别拿瞳孔的修法套到镜片上反之亦然。

也很像”背景溢出到主体”——都是不想要的场景内容出现在了不该出现的地方。但背景溢出的修法(更好的 mask、边缘 CFG 降低)这里没用,这是 generation 级别的 prior 问题,不是合成问题。

怎么预防

  • 场景里有眼镜或者任何反光面,prompt 必须显式写反光内容。
  • 默认 negative prompt 模板里加上 “window reflection in glasses, mismatched lens reflections”,特别是人像活儿。
  • Inpaint 两个镜片要用同一个 mask 一起,绝对别一个一个搞。
  • 商业人像最后做一次手动镜片清理 pass。
  • 别用晚期 inpaint 加眼镜,在 base prompt 里就把眼镜放进去。
  • 棚拍参考实际布光,走 depth controlnet。

FAQ

  • 为啥两个镜片有时反完全不同的场景? 两个镜片区域是从同一个 latent 半独立采样的,没有显式的跨区域一致性 loss。用同一个 mask 一起 inpaint,能让模型在一遍里协调它们。
  • 2026 年戴眼镜的人像用哪个模型好? 要本地可控,Stable Diffusion 3.5(guidance ~4.5)和 FLUX.2-dev 处理反光面比 SD 1.5/SDXL 强很多。要一把出图的云端模型,GPT Image 2 和 Imagen 4 Ultra 的物理逻辑和材质渲染最强。没有一个是稳定物理正确的,所以仍然要用上面的裁切检查核一遍。
  • 我 negative 里写了 “window reflection” 还是反窗户,为啥? negative prompt 只能弱弱地压制强 prior,替代不了它。你还得有一个正向 token 明说你要的反光(Step 1),顽固的图再加 Step 5 的镜片 inpaint。FLUX 上低 CFG 时经典 negative prompt 基本没用——靠正向 prompt 和 inpaint。
  • 要不要把眼镜单独生成再合成? 商业活儿经常要。干净的脸 + 干净的眼镜/镜片单独一遍再合成,能让你完全掌控反光、不用重抽整张人像。这也是拿到物理上指定好的反光的唯一路子。
  • 墨镜也会这样吗? 会,而且通常更糟——深色镜片接近镜面,模型会直接编一整个场景。修法一样:明说反光内容,两个镜片用同一个 mask inpaint。
  • 以后新模型会修这个吗? 部分会。一代代版本反光都在变好,MirrorVerse、Reflecting Reality 这类研究也在直接攻”忠实镜面反射”。但截至 2026 年 6 月没有哪个上线模型能保证几何正确的反光,所以面向客户的图都留着那一步验证。

相关阅读

标签: #ai-image #排查 #图像生成 #reflections #glasses #人像