在經歷了 Day 11 的 1x1 模組化堆疊與 Day 12 的廢墟建築演算法後,我們已經在 3D 空間中搭建起一座座具有高低漸變、轉角延伸與碎石散落的古堡殘垣。然而,若此時直接在瀏覽器中預覽,你會發現畫面依然缺乏「高級感」——即便磚塊的長寬比例維持完美的正方形,但缺乏明暗對比與陰影的方塊,看起來仍然像是一堆懸浮在平面的色塊,沒有重量感與地契感。 HD-2D 風格最核心的視覺魅力,在於將復古的 2D 像素貼圖與現代 3D 電影級光影技術進行強烈衝擊融合。今天我們將為渲染器注入物理級光影運算,透過開啟 PCF 軟陰影映射、套用影視級色調對比、配置指數地城迷霧,並精心調校一套「地下城光影三重奏」,讓每一堵石牆都在地面投射出深邃的長條陰影!
在 Three.js 中,為了效能考量,即時陰影運算(Shadow Mapping)預設是關閉的。如果只依賴材質的漫反射(Diffuse),物體之間就無法產生遮蔽關係。此外,預設的線性色彩渲染很容易讓光源照射處呈現死白曝光,而暗處則缺乏漸層。 我們在 canvas 與 renderer 初始化完成後,對 renderer 進行一系列針對影視級畫質的關鍵設定:
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1.15;
在 50x50 的大地圖邊界外,如果直接露出純黑的瀏覽器預設視窗,會產生嚴重的空間割裂感。若使用傳統的線性迷霧(THREE.Fog),霧氣是依照固定距離等比加深,視覺過渡容易顯得生硬。
我們在場景初始階段引入了經典的「指數平方迷霧(Exponential Squared Fog)」,將空間邊界悄然隱匿在未知中:
const scene = new THREE.Scene();
scene.background = new THREE.Color('#080912');
scene.fog = new THREE.FogExp2('#080912', 0.022);
要打造出遊戲般的畫面,光線絕不能只有單一來源。HD-2D 畫面的精髓在於明暗對照法(Chiaroscuro)——運用「冷調大環境陰影」來襯托未來的「暖調微光」。 我們在 src/main.js 第 6 區塊建立了由三盞不同維度的光源組成的光影系統:
// 1) 深藍紫環境冷底光
const ambientLight = new THREE.AmbientLight('#121528', 1.8);[cite: 6]
scene.add(ambientLight);
// 2) 冷調微月光 / 天頂斜射光 (投射出長條深色陰影)
const dirLight = new THREE.DirectionalLight('#a2b7ed', 2.8);
dirLight.position.set(22, 36, 18);
dirLight.castShadow = true;
dirLight.shadow.mapSize.width = 2048;
dirLight.shadow.mapSize.height = 2048;
dirLight.shadow.camera.near = 1;
dirLight.shadow.camera.far = 90;
dirLight.shadow.camera.left = -30;
dirLight.shadow.camera.right = 30;
dirLight.shadow.camera.top = 30;
dirLight.shadow.camera.bottom = -30;
dirLight.shadow.bias = -0.0006;
scene.add(dirLight);
// 3) 天地半球光 (冷暖過渡自然)
const hemiLight = new THREE.HemisphereLight('#252b48', '#0c0d16', 0.8);
scene.add(hemiLight);
【本日結語】
至此,整座地城的視覺質感迎來了翻天覆地的變革!深藍色的環境底光與斜射而下的微冷淡藍月光交織在一起,透過 ACES 電影色調與 PCF 軟陰影映射,每一塊 1x1 積木石磚都在粗糙的地面上留下了長條斜影,遠處則自然消隱在藍黑色的指數迷霧之中。 明天(Day 14),我們將在冰冷幽暗的石牆頂部,安放具備自發光材質的鍛鐵壁燈,並透過雙頻三角函數疊加演算法,實作極富生命力的物理燭火搖曳效