AI 图片光影方向矛盾:分清原因 + 7 步修复

人物左脸亮,背景太阳在右,阴影各指一方?锁定一个主光:方向 + 质感 + 来源 + 色温。

人物左脸被照亮,可背景的太阳明显在右侧;下巴的阴影指一个方向,墙上的阴影又指另一个方向。哪怕你还说不出哪里不对,大脑已经判定”错了”——因为人类对光影一致性异常敏感。

最快的修法: 把 Prompt 里所有光线和时段的词全删掉,然后只写一个主光,格式是 方向 + 质感 + 来源 + 色温(例如 soft key light from camera left, window source, 5600K daylight)。一个方向,一个来源。光这一步就能解决大多数情况。本文后面讲清楚它为什么会发生,以及当光改 Prompt 还不够时该上的重型工具(负向 Prompt、LoRA 权重、ControlNet、重打光、inpaint)。

先判断你属于哪一类

动手之前先做这个快速分诊,它会告诉你直接跳到下面哪一步。

症状最可能的原因跳到
Prompt 写了两个以上方向(leftrightbehindfront多个光源方向Step 1
Prompt 有两个以上时段 / 天气词(golden hour + overcast + neon时段描述自相矛盾Step 2
关掉风格 LoRA 后光线就一致了LoRA 自带固定打光Step 3
去掉参考图(img2img / IP-Adapter / --cref / --oref)就好了参考图光线和 Prompt 打架Step 5 / Step 6
Prompt 提了好几个环境但没写明确光源模型为合理化每个环境而编出多个光源Step 1
整张图 90% 都对,只有一块错仅局部错误Step 7

常见原因

按命中率从高到低排列。

1. 同一 Prompt 里写了多个光源方向

"portrait lit from the left, golden hour sun behind subject, dramatic side light from right, studio softbox key light"

你刚刚告诉模型”光从 4 个方向来”。它没办法同时满足四个,于是取平均,结果就是”四面八方都有光”。

如何判断: 扫一遍 Prompt,看光相关的词附近有没有 leftrightbehindfronttopbottom。出现两个以上方向就是冲突。

2. 时段 / 天气描述自相矛盾

"golden hour, overcast, dramatic sunlight, soft diffused, night neon"

每个词都隐含了方向和质感:金色时刻是暖低角;阴天是无方向柔光;夜间霓虹是多个有色点光源。混在一起模型就乱了。

如何判断: 找 Prompt 里多于一个的时段 / 天气词,只留一个。

3. 风格 LoRA 的固定打光和你描述的打光打架

很多风格 LoRA(动漫、“cinematic”、时尚大片)训练数据本身光线统一。LoRA 想强加它学到的光,你的 Prompt 又把它往别处拉,结果就是半 LoRA、半 Prompt。

如何判断: 同一条 Prompt,关掉 LoRA 光线一致、开 LoRA 就冲突——LoRA 就是源头。

4. 根本没描述光源

不描述光线时模型会自己挑一个。如果 Prompt 暗示了多个环境(cinematic portrait at home, sunset outside the window, lamp on desk),它会编出多个互相冲突的光源去”合理化”所有环境。

如何判断: Prompt 没有显式光线方向或质感,却提到了多个环境元素。

5. 参考图和 Prompt 描述不一致

img2img、IP-Adapter,或一张光线和你文字描述不同的角色 / 风格参考图。模型部分听参考、部分听文字,于是冲突。这里有一处自本文写成以来的变化需要注意:在 Midjourney 上,--cref 只在 V6 和 Niji V6 有效;V7 会忽略 --cref,改用 --oref(Omni Reference),权重参数是 --ow(范围 0 到 1000,默认 100)。--ow 设得高,就算你文字写的是别的光,也会强行套用参考图自带的打光。

如何判断: 去掉参考图、只跑文字。如果光线变一致了,参考图就是问题。

最短修复路径

Step 1:用摄影术语锁一个主光

把”形容词汤”替换成精确规格:方向 + 质感 + 来源 + 色温。

差(形容词汤)好(摄影规格)
golden hour, dramatic, side lit, cinematicrim light from camera left, low-angle golden hour sun (5pm), warm 3200K, soft shadow falloff
studio portrait, beautiful lightingsingle softbox key light at 45 degrees camera right, fill card on left at -1 stop, no rim
moody, cinematic, dramaticsingle hard light from camera left, motivated by window, deep shadow on shadow side, 5600K daylight

可取用的词库:

  • 方向: from camera leftfrom camera rightfrom abovefrom behindfront-lit
  • 质感: hard lightsoft diffuseddappleddirect sunlightbounced fill
  • 来源: golden hour sunwindow lightsoftboxpractical lampneon signs
  • 色温: 3200K tungsten warm5600K daylight neutral2200K candle warm

在 Midjourney V7 及其他走自然语言的模型上,把它写成一句简短的”摄影 brief”句子,而不是一串逗号标签,例如 Rembrandt key light from camera left, single window source, warm late-afternoon tone——句子比互相竞争的标签更好解析。

Step 2:选定一个时段,别贪心

不要写 golden hour overcast neon dawn。挑一个,让它同时定方向和质感:

  • golden hour:暖、低角、有方向
  • overcast:柔、无方向、偏冷
  • midday sun:硬、顶、中性
  • night urban neon:多个冷色点光源
  • studio:可控,再选 softbox 或 hard

Step 3:LoRA 冲突时降权重

风格 LoRA 把光焊死时,降低它的权重:

# A1111 / Forge 语法
<lora:my_style:0.5>   # 原来 0.9 - 降到 0.5

# ComfyUI
LoRA loader -> strength 0.5

0.40.6 通常足够保留风格味道又不锁死光线。如果你确实需要风格满权重,那就别降权重,改用 ControlNet 来锁方向(Step 6)。

Step 4:用负向 Prompt 拦冲突(仅 SD 系)

负向 Prompt 只对 SD / SDXL / Flux 系有效,对 Midjourney 和 DALL-E 完全无效,所以那两家直接跳过本步,靠 Step 1 到 Step 2。

conflicting lighting, mixed shadows, multiple light sources,
inconsistent shadow direction, multiple sun positions,
contradictory lighting, ambiguous light source

负向词要写窄。如果你本来就想要戏剧性阴影,就别一股脑屏蔽 shadows,否则会把画面压平。某个词在同种子(same seed)重跑后看不出帮助,就删掉它。

Step 5:降低参考图的影响力

如果是参考图在强加它自己的光:

  • img2img: 调高 denoising strength,让模型更多依赖你的文字,通常 0.60.75
  • IP-Adapter: 把 IP-Adapter 权重降到大约 0.40.6,或切到 “style only” / “composition only” 模式,让它不再传递参考图的光线。
  • Midjourney V7: 降低 --ow(试试 --ow 40--ow 60);V6 / Niji 用户则在 --cref 上降 --cw

Step 6:用 ControlNet Depth/Normal 强制阴影方向

需要严控时,给 ControlNet 喂一张已经带有你想要的打光设置的 depth 或 normal 图:

# ComfyUI
- ControlNet Depth 或 Normal-from-image(MiDaS / Marigold 预处理器)
- 喂一张 3D 渲染或样片,光线就是你要的方向
- ControlNet 强度:0.5 到 0.7

normal map 携带了表面朝向信息,模型因此知道每个面朝哪、并据此一致地打阴影。像 “Normal Map Lighting” 这类节点会暴露 light_yawlight_pitch(光源的水平角和垂直角),想精确调方向、而不是从样片照搬时可以用它。

Step 7:事后重打光(IC-Light),或局部 inpaint

如果构图很好、只是光不对,不必整张重抽。两个办法:

  • 整张重打光:用 IC-Light(“Imposing Consistent Light”,强加一致光照),有 ComfyUI / Forge 扩展。它接收你现有的图加上一个指定的光线方向,重新渲染出全画面一致、连贯的光照和阴影。“只给主体重打光”用前景条件模型 iclight_sd15_fc,“让主体匹配新背景”用背景条件模型 iclight_sd15_fbc。注意:更新的 IC-Light V2 截至 2026 年 6 月仍是非商用 / 仅研究授权,商用请用初代 IC-Light。
  • 局部 inpaint:整张 90% 都对、只有一块错(比如方向反的墙影)时:
    • Mask 错的那块
    • inpaint 的 Prompt 里明确写出正确方向
    • Denoise 0.50.7,保留周围环境

怎么确认修好了

发图前检查这三点,最好在同一种子(same seed)上做,这样只有你的改动在变:

  1. 阴影同侧。 选主体和最近的物体,它们的阴影应落在同一侧、角度也相近。
  2. 眼神光一致。 眼睛、眼镜或任何反光面上的高光点,应出现在主光来的那一侧,且位置统一。
  3. 背景和主体对得上。 如果画面里有太阳或窗户,主体的亮面应朝向它,而不是背着它。

三点都成立,光影就连贯了。哪一条不过,回到上面对应的原因。

预防建议

  • 先描述主光,辅光 / 轮廓光只在必要时再补。
  • 用摄影术语(rim light from camera left, 5600K)替代形容词(dramatic lighting)。
  • 给每种常见情绪存一段”光线预设”片段,随时粘贴(金色时刻 / 阴天 / 棚拍 softbox / 夜间霓虹)。
  • 用风格 LoRA 时,先看它默认打什么光,再按这个光去配 Prompt,别反着写。

常见问题

为什么 AI 完全无视我的光线 Prompt? 通常是有更强的信号在压制它:高权重的风格 LoRA、自带光线的参考图,或两个互相矛盾的光线词彼此抵消。把 Prompt 精简到只剩一个光线方向(Step 1);若有 LoRA 或参考图,先降它们的权重(Step 3 / Step 5),再把光线词加回去。

负向 Prompt 能修光影矛盾吗? 只在 Stable Diffusion / SDXL / Flux 上有用,而且只是辅助手段。修正正向 Prompt(一个主光)才是主力,conflicting lighting, mixed shadows 这类负向词只是收尾。负向 Prompt 对 Midjourney 和 DALL-E 无效。

Midjourney 里 --cref 还能控角色光线吗? 只在 V6 和 Niji V6 有效。截至 2026 年 6 月,Midjourney V7 会忽略 --cref,改用 --oref(Omni Reference)配 --ow 权重(0 到 1000,默认 100)。如果角色光线总是跟着参考图走、从不跟你的 Prompt,就调低 --ow

怎么不重抽整张图就修光? 用 IC-Light 给现有成图按一个指定方向重打光(Step 7),或者只对错的那块做 inpaint,denoise 设 0.50.7。两种都保留构图,只改光。

色温该写多少? 按来源匹配:室内钨丝灯约 3200K,日光或晴天窗光约 5600K,烛光或暖色实用灯约 2200K,金色时刻偏暖 3000K4000K。指定一个色温能防止模型把冷暖光源混成一团浑浊。

相关阅读

标签: #图像生成 #排查 #排查