網易首頁 > 網易號 > 正文 申請入駐

僅靠CSS、HTML復刻《DOOM》,程序員極限“整活”:把div元素當3D游戲引擎用

0
分享至


編譯 | 蘇宓

出品 | CSDN(ID:CSDNnews)

多年來,“HTML、CSS 到底算不算是編程語言”一直是前端圈一個頗具爭議的話題。

一邊是工程師堅持認為,它們只是標記與樣式描述工具,不具備傳統意義上的邏輯能力;另一邊則認為,在現代瀏覽器體系下,CSS 已經具備足夠復雜的表達能力,甚至可以完成一些超出“樣式表”范疇的工作。

爭論還沒完全有結論,一個更“實戰化”的例子就出現了。

來自荷蘭的開發者 Niels Leenheer 近日做了一件看起來有點離譜的事:他沒有使用 WebGL,也沒有依賴任何游戲引擎,僅僅依靠最基礎的 HTML 和 CSS,就復刻出了一個“能玩的《DOOM》”。

在這個被稱為 cssDOOM 的項目里,墻壁、地板、木桶、甚至惡魔怪物,都不是傳統意義上的圖形資源,而是通過一個個在三維空間中不斷變形的

標簽構建出來的。JavaScript 只負責游戲邏輯與主循環,而所有畫面的渲染工作,則完全交給 CSS 來完成。

項目地址:https://github.com/NielsLeenheer/cssDOOM



Niels Leenheer 是誰?

Niels Leenheer 是一位資深開發者,他最為人熟知的創建了是 HTML5 標準測試網站 HTML5test.com,以及瀏覽器用戶代理解析工具 WhichBrowser。同時,他也是 Fronteers 大會委員會的成員。

此前,他曾完成一項趣味實驗,成功在示波器上運行《Doom》,并借此編寫代碼,從原版游戲 WAD 資源文件中提取地圖數據。

本次 CSS 版《Doom》,正是在該實驗的基礎上迭代開發而來。


純靠 HTML、CSS,Doom 是怎么實現的?

Niels Leenheer 首先將提取的游戲地圖數據,編譯為由數千個`

`元素構成的靜態場景。

">

每一個元素都標注了《Doom》原始坐標參數。


隨后,瀏覽器的布局與合成系統會接管渲染工作,通過 CSS 的 transform 以及諸如 hypot()、atan2() 等數學函數,把這些元素渲染成定位在三維空間中的對象。

}

與其讓 JavaScript 負責完整的三維幾何計算,這個實現選擇了一種更“偷懶”的方式:腳本只傳遞原始的坐標點,以及地板和天花板的高度等參數作為自定義屬性,其余諸如墻體寬度、旋轉角度等三角計算,全部交給 CSS 引擎來完成。

這種分工是有意為之的:游戲核心循環邏輯改編自《毀滅戰士》開源 C 語言代碼,由 JavaScript 負責運行,同時僅向 CSS 開放坐標數據、狀態參數與少量自定義屬性,構成輕量化渲染層。

Niels Leenheer 也曾嘗試把游戲狀態和邏輯完全交給 CSS 來處理,但很快發現并不現實,于是放棄了這一思路,不過渲染路徑依然幾乎完全留在樣式層完成。

整個項目中一個關鍵難點,在于如何把《DOOM》的坐標體系和渲染技巧,適配到瀏覽器的 3D 處理方式上。比如地面,就是通過將

元素繞 X 軸旋轉 90 度來實現的,然后再借助 clip-path 的 polygon(),或更新的 shape() 語法,將其裁剪成任意形狀的扇區多邊形,從而支持復雜輪廓甚至奇偶填充規則。


在不同區域之間實現無縫紋理鋪設的關鍵,是將背景位置錨定在“世界坐標系”中。例如,如果一個元素在水平和垂直方向分別偏移了 200px 和 400px,那么它的 background-position 就會被設置為 -200px -400px,這樣紋理圖案就能像被連續鋪在一整塊平面上一樣對齊。

場景的移動方式也比較特殊:它并不是通過“攝像機”來移動視角(因為 CSS 本身并沒有真正的攝像機概念),而是通過移動整個“世界”來實現效果。JavaScript 會記錄玩家的位置和角度,并將其存儲在四個自定義屬性中,而 CSS 會對這些數值進行反向計算,使場景朝相反方向移動,同時通過額外的 translate 來補償透視效果,其余部分則交給瀏覽器的渲染系統完成。

敵人和投射物的精靈渲染則依賴“廣告牌(billboard)”技術:CSS 會讓每個 sprite 始終面向觀察者,在需要時通過 scaleX 進行鏡像翻轉,并使用 step() 動畫來推進精靈幀序列,而 JavaScript 只負責更新對應的狀態屬性。


場景光照、自動門、升降平臺、彈道特效,統統被轉化為可動態變更的樣式狀態問題。區域亮度以級聯自定義屬性存儲,搭配亮度濾鏡統一調暗昏暗區域,無需逐個修改場景元素;游戲大門通過自定義屬性綁定 CSS 過渡動畫,實現抬升開合,腳本僅需切換狀態標簽,動畫播放完全交由瀏覽器原生驅動。

彈藥彈道通過起點、終點坐標與飛行時長定義,CSS 依靠位移動畫完成彈道位移,搭配獨立旋轉屬性,讓投射物始終朝向玩家。

現代布局特性還被巧妙用來實現游戲自適應適配。原版固定寬度的狀態欄,被重構為文檔對象模型獨立組件,彈藥數值、生命值、角色頭像、護甲值、鑰匙道具拆分展示,通過彈性布局自動排版,在窄屏設備上自動換行適配。

觀戰模式則新增一套 CSS 鏡頭邏輯。

跟隨視角利用角度正弦、余弦函數結合計算屬性,測算偏移數值,將鏡頭固定在玩家斜后方與斜上方;視角切換依靠獨立的位移、旋轉屬性,讓第一人稱與第三人稱跟隨視角之間實現絲滑過渡。

性能與畫面精度問題,也暴露了這套純 CSS 方案的固有短板。包含數千個三維變形元素的大型地圖,極易導致移動端蘋果瀏覽器出現畫面卡頓,甚至程序崩潰。

為此,Niels Leenheer 加入視域剔除機制,自動隱藏玩家視野外的幾何模型。

基礎版剔除邏輯由 JavaScript 編寫,遍歷場景元素,根據距離與角度切換隱藏屬性。

Niels Leenheer 還測試了純 CSS 剔除方案:通過樣式參數定義可見性判定,結合延時動畫與關鍵幀規則,利用樣式特性實現元素的自動顯示與隱藏。


局限性

《Doom》原生渲染的部分核心邏輯,很難直接復刻至 CSS 環境。

原版游戲會將天空紋理以純二維形式,繪制在地圖實體前方的虛擬墻體上;而CSS渲染必須構建完整三維空間,天空圖層需要置于所有景物后方。

這一差異會導致原版被天空遮擋的模型暴露出來,Niels Leenheer 只能額外增加剔除規則,隱藏玩家視角中被天空墻體遮擋的物體。

Niels Leenheer 明確表示,該項目絕非 WebGL、WebGPU 專業圖形渲染方案的替代品,性能瓶頸也客觀存在,但這并非本次開發的核心目的。

他在分享中提到,這項開發旨在突破 CSS 的能力邊界。三角函數運算、自定義屬性動畫、裁剪路徑、SVG濾鏡、錨點定位等成熟商用級 CSS 特性,都被賦予了標準制定者從未設想過的全新用途。

最終成品完整可玩,直觀證明:只要合理運用大量`

`元素與現代 CSS 語法,無需調用任何圖形編程接口,就能在瀏覽器中完整復刻《毀滅戰士》的游戲世界。

長久以來,愛好者不斷挖掘各類低門檻、非常規設備運行《毀滅戰士》的可能性,CSS 只是最新的趣味載體。

也正如 Niels Leenheer 所言,如果說還有什么意義的話,那它至少回答了一個沒人真正問過的問題:CSS 能不能跑《DOOM》?

答案是:可以。確實可以。

來源:https://nielsleenheer.com/articles/2026/css-is-doomed-rendering-doom-in-3d-with-css/

https://www.techspot.com/news/111922-developer-rebuilds-doom-using-only-css-html-turning.html



【活動分享】"48 小時,與 50+ 位大廠技術決策者,共探 AI 落地真路徑。"由 CSDN&奇點智能研究院聯合舉辦的「全球機器學習技術大會」正式升級為「奇點智能技術大會」。2026 奇點智能技術大會將于 4 月 17-18 日在上海環球港凱悅酒店正式召開,大會聚焦大模型技術演進、智能體系統工程、OpenClaw 生態實踐及 AI 行業落地等十二大專題板塊,特邀來自BAT、京東、微軟、小紅書、美團等頭部企業的 50+ 位技術決策者分享實戰案例。旨在幫助技術管理者與一線 AI 落地人員規避選型風險、降低試錯成本、獲取可復用的工程方法論,真正實現 AI 技術的規模化落地與商業價值轉化。這不僅是一場技術的盛宴,更是決策者把握 2026 AI 拐點的戰略機會。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
曝球球退出陳翔六點半!疑細節原因曝光,否認與“蘑菇頭”是夫妻

曝球球退出陳翔六點半!疑細節原因曝光,否認與“蘑菇頭”是夫妻

裕豐娛間說
2026-04-26 19:04:43
黃金價格跌破1000元!看來這茬兒韭菜,是到收割的時候了?

黃金價格跌破1000元!看來這茬兒韭菜,是到收割的時候了?

正經說個事兒
2026-03-23 23:32:34
大便要排隊,強奸卻隨時:一名日本女戰俘的1944年日記

大便要排隊,強奸卻隨時:一名日本女戰俘的1944年日記

英子談
2026-04-26 15:56:57
“我被炸死是活該?”鄭麗文一句話讓民進黨代表“破防”

“我被炸死是活該?”鄭麗文一句話讓民進黨代表“破防”

矚望云霄
2026-04-26 21:12:17
取消戶籍限制!教育部突發新規!9月1日起執行:家長再也不用焦慮

取消戶籍限制!教育部突發新規!9月1日起執行:家長再也不用焦慮

芳姐侃社會
2026-04-24 22:52:50
中國PCB十強:誰是真龍?

中國PCB十強:誰是真龍?

風風順
2026-04-25 14:40:06
曾毓群一聲咳嗽,李斌欲言又止

曾毓群一聲咳嗽,李斌欲言又止

版面之外
2026-04-26 07:53:41
中超最新積分榜出爐!成都蓉城繼續領跑,津門虎強勢反彈擺脫墊底

中超最新積分榜出爐!成都蓉城繼續領跑,津門虎強勢反彈擺脫墊底

徽派體育
2026-04-25 23:59:32
給5%股份就想“白嫖”核心代碼?這屆風投和AI大牛,錯惹了陳天橋

給5%股份就想“白嫖”核心代碼?這屆風投和AI大牛,錯惹了陳天橋

數智研究社
2026-04-25 12:43:34
《八千里路云和月》大結局:丁玉嬌的良人從不是萬福,而是田家泰

《八千里路云和月》大結局:丁玉嬌的良人從不是萬福,而是田家泰

慫熊劇場
2026-04-26 16:18:01
賺麻了!油田和煤田下居然有鈾!中國終于摘掉了“貧鈾”的帽子

賺麻了!油田和煤田下居然有鈾!中國終于摘掉了“貧鈾”的帽子

說歷史的老牢
2026-04-26 10:26:43
38歲梅西怒了!賽后直接離場:4次妙傳全被吐餅 2場球荒主場3連平

38歲梅西怒了!賽后直接離場:4次妙傳全被吐餅 2場球荒主場3連平

風過鄉
2026-04-26 11:01:38
女孩臥鋪車求救武警,戰士轉頭裝睡,4小時后所有人都愣住了

女孩臥鋪車求救武警,戰士轉頭裝睡,4小時后所有人都愣住了

蕭矹影視解說
2026-04-15 13:08:16
牡丹花下死!汪峰官宣戀情才2年,森林北又走上了章子怡的老路

牡丹花下死!汪峰官宣戀情才2年,森林北又走上了章子怡的老路

落雪聽梅a
2026-04-24 07:58:40
白人女性與黑人女性的體味差異,網友真實分享引發熱議

白人女性與黑人女性的體味差異,網友真實分享引發熱議

特約前排觀眾
2025-12-22 00:20:06
隨著穆帥率隊4-1大勝,阿維卡2-1,葡超最新積分榜出爐

隨著穆帥率隊4-1大勝,阿維卡2-1,葡超最新積分榜出爐

側身凌空斬
2026-04-26 03:12:20
多國封殺后首露面!坎耶帶小 17 歲妻子現身酒店,造型依舊辣眼

多國封殺后首露面!坎耶帶小 17 歲妻子現身酒店,造型依舊辣眼

橙星文娛
2026-04-26 09:51:15
美國發聲后,日本也表態了,臺海出現變數,鄭麗文咬死一句話

美國發聲后,日本也表態了,臺海出現變數,鄭麗文咬死一句話

一口娛樂
2026-04-26 20:58:00
1995年,49歲的特朗普來到香港,懷中抱著一位神秘女人,她是誰?

1995年,49歲的特朗普來到香港,懷中抱著一位神秘女人,她是誰?

文史達觀
2025-01-26 06:45:03
威廉凱特再搬家:離宮殿更遠,離父母更近,王室排場更淡了

威廉凱特再搬家:離宮殿更遠,離父母更近,王室排場更淡了

世界王室那些事
2026-04-26 19:05:34
2026-04-26 22:15:00
CSDN incentive-icons
CSDN
成就一億技術人
26482文章數 242273關注度
往期回顧 全部

科技要聞

漲價浪潮下,DeepSeek推動AI“價格戰”

頭條要聞

特朗普內閣又一女部長落馬:強迫男下屬為其提供性服務

頭條要聞

特朗普內閣又一女部長落馬:強迫男下屬為其提供性服務

體育要聞

森林狼3比1掘金:逆境中殺出了多孫穆?!

娛樂要聞

僅次《指環王》的美劇,有第二季

財經要聞

事關新就業群體,中辦、國辦發文

汽車要聞

預售19.38萬元起 哈弗猛龍PLUS七座版亮相

態度原創

藝術
健康
時尚
數碼
親子

藝術要聞

18幅 列賓美院教師Artem Tikhonov風景寫生

干細胞如何讓燒燙傷皮膚"再生"?

比闊腿褲還時髦?今年夏天一定要有“這條褲子”,減齡又松弛

數碼要聞

MOREFINE上架G2外置顯卡,內置RTX 5060 Ti

親子要聞

今天我們來吃整蠱海盜桶糖果食玩

無障礙瀏覽 進入關懷版