Hawktober Horrors 2026 went live on itch.io today, September 1, hosted by HawkZombie, and runs through November 1 — a two-month window built around horror. Most entries end up almost entirely black: one flashlight or lantern, everything else at zero lux. That's where imported PBR props stop behaving the way they did in a lit test scene. A model that reads correctly under a three-point studio rig either vanishes into the black or blows out into a flat white blob the moment ambient light drops near zero, and the fix has nothing to do with the mesh.
Why your horror props go invisible in the dark
![]()
The usual culprit is emissive clamping, not lighting setup. glTF 2.0's base spec caps the `emissiveFactor` channel at 1.0 per component — fine for a UI icon, useless for a lantern flame or a glowing rune that needs to actually read against true black. Without the `KHR_materials_emissive_strength` extension, an artist cranking emissive in Blender or Substrate gets clipped to that ceiling on export, and the exported GLB shows a dim gray smudge instead of a light source. Unity's glTFast, Godot's importer, and UE5's Interchange pipeline all support the extension, but only if it's actually written into the file — Blender's glTF exporter has had it on by default since 3.6, so the fix is usually a re-export with current settings rather than new geometry.
The second failure mode is exposure, and it's an engine setting, not an asset problem. Unity's URP and UE5's Lumen both run auto-exposure by default, which means a fully dark corridor gets brightened toward mid-gray the instant nothing bright is in frame — so your jump-scare prop, lit correctly at 40 lux, reads as flat and pre-adjusted because the camera already compensated for the dark. Godot's environment doesn't auto-expose unless you enable it explicitly, which is one reason horror jams built in Godot tend to look more consistently dark than the Unity or UE5 entries.
Texel density and poly budget for close-up horror framing
![]()
Horror games frame props close — a lantern held at arm's length, a corpse examined at a foot away — which means the texel density that works for an open third-person environment (roughly 128–256 px/meter is standard for BitSoul3D's game-ready catalog) reads as smeared once the camera is six inches from the surface. For anything the player can pick up or inspect, budget 512 px/meter minimum on the hero faces; drop everything else in the scene back to 128 to keep the texture memory total flat. That trade is the actual lever, not overall resolution — a scene with one 512-density prop and forty 128-density set pieces costs less VRAM than uniformly texturing everything at 256.
Poly budget follows the same logic in reverse. itch.io horror jams are almost always shipped as WebGL/WebGPU browser builds, and most jam hosts cap the playable build at 500 MB–1 GB zipped. A single 80k-tri hero prop examined in a jump-scare close-up is worth the budget; forty 15k-tri background props that never get looked at directly are not. Poly-reduce the set dressing hard — BitSoul's 3D Studio runs poly-reduction in-browser on the reader's own GPU, so you can check the reduced mesh's silhouette in a dark test scene before committing triangle count you don't have.
| Engine | Default dark-scene problem | Fix |
|---|---|---|
| Unity (URP) | Auto Exposure brightens near-black frames toward mid-gray | Volume component → disable Auto Exposure, or clamp min/max EV to a tight range |
| Godot 4.x | SDFGI probes recompute per-frame even with one static light, costing frame time for no visual gain | Use Baked Lightmaps instead of SDFGI for static horror sets; keep SDFGI only for dynamic light sources |
| UE5 (Lumen) | Lumen Global Illumination quality scales cost with scene complexity even when 95% of the frame is black | Post Process Volume → lower Lumen GI/Reflection quality, rely on a few placed local lights instead of full GI in fully dark rooms |
Two gotchas worth checking before you submit. First, Godot's GLTF importer historically flattened normal maps on import in some material configurations — worth a visual check on any close-up horror prop with fine surface detail, since a flattened normal map is far more visible under a raking flashlight beam than under flat daylight. Second, if you're bundling a WebGPU build for browser play and targeting Safari, confirm your target browser actually has WebGPU coverage before relying on it as a fallback path — Safari 26 shipped support, but older visitor browsers still route through WebGL, and that path handles emissive strength differently.
For a lantern-style prop to test this against directly, BitSoul3D's Oil Lantern model ships with emissive strength baked into the GLB — a free account's two monthly downloads cover evaluation, and commercial use is included with paid memberships (pricing).
If your jam entry is going out as a browser build, the export-size discipline covered in Meta's Three.js jam CDN budget applies directly to a two-month itch.io horror jam too — the 35 MB ceiling is stricter than itch's cap, so building to that budget first gives headroom. For the emissive clamping issue specifically, the walkthrough in why emissive glTF materials render dim in Unity covers the extension flags in more depth than fits here. And if your build target is a browser export rather than a native binary, Godot's GLTF web export path from the GMTK jam covers the same WebGL/WebGPU fallback question from the engine side.
---
*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*
---
Need drop-in assets for this workflow? Grab the 94-model Animal Bundle on the BitSoul marketplace and drop them straight into your project.