AI Image Glasses Reflections Don't Match the Scene

Generated portrait with glasses shows a window, sky, or environment in the lenses that isn't in the scene. Why diffusion models hallucinate reflections and the fastest fix, verified June 2026.

You generated a studio portrait. Black backdrop, single softbox key light, subject wearing glasses. The portrait looks great until you look at the lenses: one lens reflects what looks like a window with daylight; the other reflects an entirely different scene — maybe a bookshelf, maybe trees. Neither matches the actual rendered environment, and the two reflections don’t match each other either, which instantly breaks the photo. The same failure shows up in water surfaces, mirrors, polished metal, and even pupil catchlights.

Fastest fix: after your base generation, mask both lenses with one selection (not separately) and inpaint at denoise 0.5 with a prompt that names the reflection you want and forbids windows — for example both lenses showing the same soft studio reflection, no window. That single step coordinates the two lenses and kills the window prior more reliably than any prompt tweak on the first pass. Details and the full decision tree below.

This is the model failing at a specific physics constraint: a reflection must be a transformation of what’s actually in the scene, applied consistently across paired reflective surfaces. Diffusion models don’t model light transport — they pattern-match what eyeglass reflections “usually look like” in their training data, which is full of windows and softboxes. As of June 2026 even the strongest frontier models only approximate this: GPT Image 2 still fails the well-known “Rubik’s Cube mirror reflection” spatial test, and FLUX.2 will sometimes render the front of a person where a mirror should show their back. So treat this as a problem to manage, not one any current model fully solves.

Which bucket are you in

SymptomMost likely causeGo to
Two lenses show different scenesLenses sampled independentlyCauses 1, fix Step 5
Reflection is a window/sky you never asked forTraining prior overrides promptCauses 2 & 4, fix Steps 1-2
Big shapes obey prompt, lenses don’tGuidance too low on small regionsCause 3, fix Step 3
Tiny round/thin frames, reflection is mushLens area too small to renderCause 5, fix Steps 5-6
Reflection changed after upscalingUpscaler hallucinated contentCause 6, fix Step 7
Glasses added after the portraitInpaint had no scene contextCause 7, prevention

Common causes

1. Model lacks a scene-coherence prior for reflective surfaces

Diffusion models render each region semi-independently. The left lens and the right lens are generated from the same latent but with no explicit constraint that they show the same reflection. The training data has glasses with window reflections, so each lens independently samples “what reflection might appear here.”

How to spot it: Cover the rest of the image and just look at the two lenses. If they look like they came from two different photos, the model is sampling them independently.

2. Background prompt and reflection prompt are contradictory

Your prompt says “studio backdrop, seamless black, dramatic lighting.” But the model has seen far more “person wearing glasses” images with window reflections than with black-studio reflections, so the prior overrides your prompt.

How to spot it: The reflection content is something common in training data (window, sky, trees) regardless of what you asked for in the scene.

3. Guidance too low — prompt isn’t enforced strongly on small regions

On classic CFG models (SD 1.5, SDXL) at low CFG (3-5), the model leans on its prior for small detail regions like lenses. The big shapes obey the prompt; the small reflective surfaces don’t. Note the guidance numbers differ by model family (as of June 2026): SDXL behaves around CFG 5-8; Stable Diffusion 3.5’s officially recommended guidance is about 4.5 and pushing it higher causes “deep frying” (oversaturated skin, exaggerated specular highlights — which can worsen lens glare); FLUX is guidance-distilled, so a FLUX-dev guidance of 3-4 roughly equals old CFG 7, and FLUX.2 distilled wants CFG 1.0-1.5 at ~4 steps. Use the scale for your model, not a fixed “7.”

How to spot it: On SDXL, nudging CFG from 5 toward 7 makes the reflection more controllable while big shapes get harsher. On FLUX/SD 3.5, raising guidance instead makes everything glossier and crispier without fixing the reflection content.

4. No explicit token for reflection content

You said “wearing glasses” but never described what should be reflected. The model fills the void with the statistical average, which is daylight windows.

How to spot it: Your prompt has no mention of “reflection” or “lens” content at all.

5. Frame-style glasses lenses are too small for coherent rendering

Round John-Lennon frames or thin rectangular lenses give the model 20-40 pixels per lens at 1024x1024. There isn’t enough room to render a coherent reflected scene, so it falls back to “vaguely bright.”

How to spot it: Larger aviator or oversized frames in the same setup work fine; small lenses break.

6. Upscaler hallucinated new content in the lens region

Base generation had plausible neutral reflections. Then your upscaler — especially an AI upscaler with denoise > 0.3 — invented entirely new reflection content during the second pass.

How to spot it: Compare base output to upscaled output. If the lens region content changed substantively, the upscaler did it.

7. Glasses are an inpainted addition

You generated a portrait without glasses, then inpainted glasses on later. Inpainting has even less context about the surrounding scene and is prone to inventing window reflections out of thin air.

How to spot it: Workflow involved a separate glasses-inpaint step.

Shortest path to fix

Step 1: Add explicit reflection-content tokens

# instead of just "wearing glasses"
wearing glasses, lens reflections show studio softbox,
matching catchlights in eyes and lenses, no window reflection

You’re forcing the prior away from “window” by naming what you do want plus what you don’t.

Step 2: Add a strong negative for unwanted reflection content

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

These specific negatives bite harder than generic ones.

Step 3: Adjust guidance for your model (don’t just “set it to 7”)

On SDXL / SD 1.5, move CFG from 57 for the generation; higher CFG enforces your reflection-content tokens on small regions. If the overall image goes too punchy at 7, keep CFG 7 but reduce denoise on hires fix. On SD 3.5, stay near the recommended 4.5 — going higher “deep fries” the image and amplifies lens glare, so fix reflections by prompt and inpainting, not by cranking guidance. On FLUX-dev, raising guidance to ~4 is the equivalent move (it roughly maps to old CFG 7); on FLUX.2 distilled keep CFG 1.0-1.5 and add steps instead, then rely on Step 5 for the reflection. Use the Euler sampler with the Simple scheduler on FLUX; Euler Ancestral does not converge cleanly.

Step 4: Use a depth control or reference image for the actual scene

Provide a depth map or simple reference image showing your studio setup (e.g., a softbox to camera-left) so the model has a real geometric reference for what should reflect in the lenses.

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

On SDXL/SD 3.5 this is a standard ControlNet-Depth pass. On FLUX, depth is handled differently — FLUX.1-Depth-dev is a fine-tuned depth model, not a ControlNet add-on, so load it as the model (or use a FLUX-compatible depth ControlNet such as the InstantX/Shakker-Labs ones) rather than the SDXL ControlNet node.

Step 5: Inpaint the lenses with a coherent prompt for both

After base generation, mask both lenses together (not separately!), and inpaint with denoise 0.5 and a prompt focused on coherent reflection:

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

Masking both at once and prompting “same reflection on both lenses” is the single highest-leverage step.

Step 6: For final polish, manually paint over rogue reflections

For client work, accept that 30 seconds in any image editor — clone-stamp a clean lens over a rogue lens — gives more reliable results than another generation round. Use the model to get 90% there, then paint.

Step 7: If using an upscaler, lower denoise in the lens region

If your workflow allows region-specific denoise on upscale (e.g., Ultimate SD Upscale with mask), set lens region to denoise 0.15 instead of 0.4. Less invention, more preservation.

How to confirm it’s fixed

Before you ship, run these three checks:

  1. Crop test. Crop just the two lenses side by side. They should read as the same scene reflected at slightly different angles — same colors, same light direction — not two different photos.
  2. Catchlight match. The bright highlight in each lens should sit on the same side as the catchlight in the eyes and any specular highlight on skin (a key light camera-left puts the highlight on the subject’s right side of every reflective surface). A mismatched catchlight side is the giveaway viewers actually notice.
  3. No phantom content. Zoom to 100% (or 200% on small frames). There should be no window mullions, sky gradient, or tree shapes that don’t exist anywhere in the scene. If they reappeared only after upscaling, that’s Cause 6 — redo Step 7.

When this is not on you

Stable Diffusion 1.5 and SDXL base have essentially no understanding of geometric reflection; even with perfect prompting you get plausible but non-physical results. The 2026 frontier models are noticeably better but still imperfect: as of June 2026 GPT Image 2 fails the standard “Rubik’s Cube mirror reflection” spatial-reasoning test, and FLUX.2 can render the wrong side of a subject in a mirror. So if your project demands physically correct reflections (commercial work, product shots, anything seen at 100% zoom), don’t fight the model — use 3D rendering or composite the reflection in.

Also, the human eye is pattern-trained to notice broken reflections in eyeglasses specifically (we look at faces with glasses constantly). What feels obviously wrong to you may not register to most viewers — pick your battles.

Easy to misdiagnose as

“Eyes misaligned” — broken catchlights in pupils look similar to broken reflections in lenses, but the fix is different. Pupil catchlights respond to light-direction tokens; lens reflections respond to content tokens. Don’t apply pupil fixes to lens problems or vice versa.

Also similar to “background bleeds onto subject” — both involve unwanted scene content showing where it shouldn’t. The bleeding fix (better masking, lower CFG on edges) doesn’t help here; this is a generation-level prior, not a compositing issue.

Prevention

  • Always include explicit reflection-content tokens when glasses or any reflective surface is in the scene.
  • Default negative-prompt template should include “window reflection in glasses, mismatched lens reflections” for portrait work.
  • Inpaint both lenses together with one mask, never one at a time.
  • For commercial portraits, do a final manual cleanup pass over lenses.
  • Avoid adding glasses via late-stage inpainting; include them in the base prompt.
  • For studio shoots, reference your actual lighting setup via depth controlnet.

FAQ

  • Why do the two lenses sometimes show entirely different scenes? The two lens regions are sampled semi-independently from the same latent, with no explicit cross-region coherence loss. Inpainting both together with one mask lets the model coordinate them in a single pass.
  • Which model is best for portraits with glasses in 2026? For local control, Stable Diffusion 3.5 (guidance ~4.5) and FLUX.2-dev handle reflective surfaces far better than SD 1.5/SDXL. For one-shot hosted generation, GPT Image 2 and Imagen 4 Ultra have the strongest physical-logic and material rendering. None is reliably physics-correct, so still verify with the crop test above.
  • My negative prompt lists “window reflection” but it still shows windows. Why? Negative prompts weakly suppress a strong prior; they don’t replace it. You also need a positive token naming the reflection you want (Step 1), and on a stubborn image the lens inpaint in Step 5. On FLUX, classic negative prompts have little effect at low CFG — lean on the positive prompt and inpainting instead.
  • Should I generate the glasses separately and composite them? For commercial work, often yes. Generating a clean face plus a clean glasses/lens pass and compositing gives you full control over the reflection and avoids re-rolling the whole portrait. It’s also the only path to a physically specified reflection.
  • Does this happen with sunglasses too? Yes, and it’s usually worse — dark lenses are a near-mirror, so the model invents a full scene. The same fix applies: name the reflection content and inpaint both lenses with one mask.
  • Will this be fixed in future models? Partly. Successive releases handle reflections better, and research lines like MirrorVerse and Reflecting Reality target faithful mirror reflections directly. But as of June 2026 no shipping model guarantees geometrically correct reflections, so keep the verification step for anything client-facing.

Tags: #ai-image #Troubleshooting #Image generation #reflections #glasses #Portrait