Shanshui 是什麼?作者稱 Opus 5.5 以程式碼畫出 10 幅水墨山水,做法與授權疑點
Shanshui 是 Leon Lin 開源的 60 秒水墨山水短片,貼文稱由 Opus 5.5 以約 2.2 萬行 JavaScript 畫出十幅畫,連音效與配樂也由程式合成。本文整理畫面與配樂的做法、倉庫能驗證與不能驗證的部分、MIT 授權與參考畫來源的疑問,以及怎麼自己跑。
Shanshui 是一部 60 秒的水墨山水短片,十幅畫從竹林山谷一路走到雪中寺廟。倉庫的 README 寫明,過程裡沒有載入任何圖片、貼圖、字型或音訊樣本,畫面與配樂都是程式在執行時算出來的。
作者 Leon Lin 在 X 的帳號是 @LexnLin。台灣時間 10 月 20 日凌晨 3 點多,他貼出影片,寫著 Opus 5.5 畫了十幅中國山水。
貼文還說,所見所聞都是程式碼,約 2.2 萬行 JavaScript,連音效與背景音樂也是用程式做的。
我在 10 月 21 日早上透過公開鏡像查詢,這則貼文約有 720 個讚、約 2.5 萬次觀看,下一則貼文附上了 GitHub 倉庫。熱度不算高,但它的價值在於原始碼公開,所以有不少細節可以查證。
可以查證的是倉庫裡有什麼:WebGL2 著色器與 Canvas2D 筆觸、一套用程式合成的古箏與簫,還有完整的渲染工具。
無法查證的是「Opus 5.5 畫的」到底指什麼,因為 Opus 5.5 這個名字只出現在貼文,倉庫的文件與程式碼都沒有提到模型或工具。
另一個細節容易被忽略。倉庫說明,每幅畫是對照一張參考畫,逐區比對做出來的,但那十張參考畫不在倉庫裡,來源也沒有交代。
我的判斷是,想學創意編程、WebGL 程式化繪畫與代理協作流程的人,Shanshui 很值得讀。想直接把畫面或配樂用在商業作品的人,則要多留一步,因為程式碼是 MIT 授權,成品的構圖依據卻來源不明。
要看懂它,先從短片本身看起。
Shanshui 是什麼?60 秒、十幅畫、一條時間軸
Shanshui 是中文「山水」的拼音,指以山與水為主題的水墨畫。倉庫的 README 說明,它是十幅中國水墨山水,全部由程式畫出並動起來,剪成一支一分鐘的影片。
影片規格是 1920×1080、每秒 60 格。畫面與聲音共用同一條時間軸,節奏是每分鐘 80 拍,每幅畫佔兩小節,也就是 6 秒,每一次轉場都對齊小節線。
十幅畫依序是竹林山谷、鶴飛瀑布、索橋、浮空山峰、紅色瀑布、秋日廢墟、金色河流、石橋紅日、湖上明月與雪中寺廟。以下整理倉庫文件列出的順序、時間與轉場方式。
| 時間 | 畫面 | 轉場方式 |
|---|---|---|
| 0:00 | 竹林山谷 | 從空白紙上一筆筆畫出來,先下最深的墨 |
| 0:06 | 鶴飛瀑布 | 一層谷中的霧氣 |
| 0:12 | 索橋 | 霧氣掃過山峰 |
| 0:18 | 浮空山峰 | 鏡頭穿過雲海上升 |
| 0:24 | 紅色瀑布 | 衝過瀑布水霧 |
| 0:30 | 秋日廢墟 | 一陣楓葉被風吹過 |
| 0:36 | 金色河流 | 畫卷展開,帶著霧氣 |
| 0:42 | 石橋紅日 | 金色太陽滑進紅色太陽 |
| 0:48 | 湖上明月 | 夜色像水一樣滲進濕紙 |
| 0:54 | 雪中寺廟 | 雪越下越厚 |
從轉場設計可以看出,作者替每一次切換都編了情節,例如霧氣升起、楓葉吹過、畫卷展開,而不是單純淡入淡出。影片在 56.7 秒蓋上印章,最後畫面蒸發回紙張,只留下印。
我在查詢時,倉庫有三個發行版本。v1 在台灣時間 10 月 19 日晚上 9 點多發布,v2 在 10 點多,v3 在 10 月 20 日凌晨 2 點多,也就是貼文發出前不到 40 分鐘。
v3 的說明寫著,這是十幅畫都經過三輪品質修整後的最終版,並加上 3 倍子幀動態模糊。
這些時間點顯示作者在一個晚上內反覆修整,但倉庫沒有保留提示詞、對話紀錄或每輪修改內容,所以修改由誰主導,只能看作者自述。
短片能這麼完整,靠的是一套分層的畫法。

畫面怎麼用程式畫出來?WebGL2 與 Canvas2D 的分工
畫面的做法,倉庫的引擎文件寫得相當具體。每幅畫是一疊由後往前的圖層,每層像一張放在不同深度的紙卡,鏡頭移動時近處的松樹與遠處的山峰會有視差,所以靜止的畫面也有空間感。
靜態的筆觸,例如山石、松針與建築,會先用 Canvas2D 畫一次,轉成貼圖。接著經過一道墨水處理,讓顏料在邊緣聚集,並沿著紙張的紋理形成顆粒感,看起來像墨滲進紙裡。
會動的東西則每一格都重新計算,包括霧、雲、水、瀑布、飛鶴、落葉與雪。這些都被寫成時間的函式,也就是給定時間就得到固定的畫面,所以 README 說任何一格都能單獨渲染,結果每次相同。
引擎文件也規定,場景程式不能用 Math.random 或 Date.now,只能用事先給定種子的亂數。我只讀了文件,沒有逐行檢查每個檔案是否遵守,元素函式庫的函式簽名裡,亂數參數的預設值也還是 Math.random。
著色器是跑在顯示卡上的小程式,這個專案用它處理霧氣、水面與紙張纖維。倉庫文件把設計色票寫了出來,例如紙張的底色是 RGB 239、231、220,墨的最深處約 8 到 13,紅色只佔畫面不到 2%,這些數字來自對參考畫的量測。
我搜尋了 src 目錄的圖片與音訊載入語法,只找到兩類:一類是比對工具與實驗用場景讀取參考圖,另一類是播放自己合成的 soundtrack.wav,與 README 說的不載入任何圖片、貼圖、字型或音訊樣本一致。
要輸出成影片時,流程是用無頭 Chrome 在顯示卡上逐格渲染,在著色器裡轉成 YUV 色彩格式,直接串流給 ffmpeg 編成 H.264,過程中不會把每格圖存到硬碟。
需求是 Node 20 以上、Chrome 或 Edge,以及系統裡有 ffmpeg。
畫面之外,聲音也是同一個思路。
延伸閱讀:Claude Opus 5.5 發布:創意編程亮眼,成本與評測該怎麼看?
配樂也是程式:古箏、簫與缽怎麼合成
README 說配樂是逐取樣點合成的,樂器有古箏、簫、頌缽、風與水聲。
tools/audio.mjs 的開頭註解寫得更細:古箏用 Karplus-Strong 演算法,加上彎音、揉弦、顫音、滑音與泛音,簫是帶氣息的聲音,另有一個低音持續音與跟著畫面變化的環境音。
Karplus-Strong 是一種用很短的延遲線模擬撥弦的合成方法,原理簡單,卻能做出像弦樂器的衰減音色,常被用來在不使用錄音樣本的情況下做出撥弦聲。
音訊輸出是 48 kHz、24 位元的 WAV,並做了母帶處理,整體響度約 −14 LUFS,真峰值上限 −1.5 dBTP。−14 LUFS 是不少串流平台常用的響度參考值。
聲音與畫面共用同一個時間軸。例如楓葉被風吹過的轉場,音效會提早約 1.35 秒啟動,印章蓋下的時間點是 56.7 秒,音效也掛在這個節點上,這些提示點定義在 src/timeline.js。
要注意的是,網頁版即時播放時,聲音不會自動出現。README 寫明,要先執行 node tools/audio.mjs 產生 soundtrack.wav,再按 M 鍵播放。所以你直接開網頁,只會看到無聲的畫面。
至於旋律是原創還是參考既有曲目,作者的貼文與倉庫文件都沒有說明,這一點我無法判斷。
說完做法,就要處理最大的疑問:Opus 5.5 到底做了什麼。
「Opus 5.5 畫的」能驗證多少?作者說法與倉庫證據
貼文只有一句話:Opus 5.5 畫了十幅中國山水。我用關鍵字在倉庫的 README、docs 與程式碼裡搜尋 Claude、Opus、Anthropic 與 agent,沒有任何文字指出用了哪個模型,只有引擎文件提到多個代理可以同時工作。
引擎文件有兩處像是寫給程式代理的指示。一處要求用 Read 工具查看輸出,因為它能顯示圖片,另一處說實驗用的 lab 場景不會註冊,所以多個代理可以同時工作而不互相覆蓋檔案。
Read 工具是部分代理環境(例如 Claude Code)的檔案讀取功能名稱,這是我的觀察,文件沒有指名是哪個代理。文件是給程式代理看的操作說明,與貼文的說法相容,但仍不能證明就是 Opus 5.5。
文件還給了代理一套自我檢查工具。still.mjs 可以把參考畫與渲染結果上下疊放、左右並排或放大局部比較,還能輸出多個時間點的聯絡表。這種「看圖、比對、修正」的循環,是這類創意編程專案常見的做法。
貼文說約 2.2 萬行,我下載了倉庫目前的原始碼壓縮檔,用 wc -l 計算,數字包含空白行。src 目錄的 JavaScript 約 24,000 行,其中實驗用的 lab 約 1,460 行,扣掉後約 22,600 行。
如果再加上 tools 資料夾約 1,140 行,src 與 tools 合計約 25,200 行,所以 2.2 萬行與其中一種算法吻合。
我沒有辦法驗證的部分有四項:實際用了哪個模型與版本、花了多少提示與時間、哪些決策來自人類、有沒有人手動改過程式碼。倉庫沒有提供這些資料,貼文也沒有。
所以目前能確定的是:作者表示由 Opus 5.5 完成,倉庫內容與代理協作相容,但詳細分工與成本未公開。
最後來看授權,這是創作者最容易踩雷的地方。
延伸閱讀:一句 Prompt 做出日式墨流し互動網頁:用 Claude Fable生成 WebGL 流體水墨畫布
授權與參考畫:MIT 涵蓋程式碼,成品畫面不一定
倉庫採 MIT 授權,授權檔署名 2026 年 Leonxlnx。這代表你可以使用、修改與散布程式碼,只要保留授權聲明。
但 README 說,十幅畫是對照參考畫逐區比對做出來的,而且參考圖不在倉庫裡。docs/STYLE.md 開頭還說,那十張參考圖是一個系列,是暖色宣紙上的水墨山水。倉庫沒有說明它們是誰畫的、從哪裡來,也沒有標示授權。
文件對參考畫的依賴很深。STYLE.md 逐幅記錄了每張參考畫裡元素的位置,例如參考圖 01 的主松從左緣長出、紅色雙層亭子在懸崖頂、三隻鶴往右飛,並給出約略的像素座標,成品的構圖就是依此重建。
參考圖的編號與短片順序不同,01 對應的是短片的第二幅鶴飛瀑布。
這帶來兩個疑問,而我都無法從公開資料回答。第一,參考畫是原創、AI 生成、還是他人的作品。第二,如果是他人的作品,照著它的構圖逐區重建,是否涉及衍生創作的權利問題。
發行頁的影片檔,授權也沒有另外說明。MIT 條文寫的是「軟體與相關文件檔案」,影片這種輸出是否涵蓋,要由作者說明。配樂同樣如此。
所以我的建議是這樣分層看。學習與研究程式碼,MIT 允許。要把影片放進商業作品、廣告或販售商品,先問作者並請他說明參考畫來源,不要因為倉庫是 MIT 就直接使用。
想自己跑的人,下一步是準備環境。
怎麼自己跑?環境、指令與注意事項
README 的即時預覽流程很短:安裝相依套件,執行 npm run serve,開啟終端機印出的網址,影片就會在瀏覽器裡即時播放。
網址後面加 ?scene=s03 可以只看一幅畫,加 ?scale=1 則用完整 1080p 渲染。空白鍵暫停,方向鍵跳到下一幅或上一幅。
輸出成 MP4 需要兩步。先執行 node tools/audio.mjs 產生配樂,再執行 node tools/render.mjs,指定輸出檔、配樂檔與取樣數,例如 --samples 2。
開發相依套件只有兩個,puppeteer-core 與 ws,用來驅動無頭 Chrome 與本機通訊。
倉庫是新的,所以我建議先讀過 package.json 與 tools 資料夾的程式,再在獨立資料夾裡安裝,因為 npm install 會下載套件,執行也會啟動瀏覽器與本機伺服器。
效能要先有心理準備。引擎文件把每格渲染預算訂在 40 毫秒內,目標顯示卡是 Radeon 780M 內顯。
40 毫秒相除約等於每秒 25 格,低於影片的 60 格,這是我依文件預算算的,所以即時預覽未必順暢。我沒有量測,你的電腦能不能即時播到每秒 60 格,只能自己試。MP4 則是逐格離線渲染出來的,不受這個限制。
如果只想看成品,可以直接看 X 貼文的影片或倉庫發行頁的 MP4。v3 的檔案約 131 MB,下載前先確認空間。
適合誰、不適合誰與導入前檢查
最適合的是想學程式化繪畫的人。做創意編程、生成式藝術與動態設計的開發者,可以讀圖層與視差、墨水後處理、霧氣的時間函式與轉場的實作,這些在文件裡都有拆解。
也適合想了解代理協作的人。文件寫成給代理看的格式,包含工具用法、預算、禁止事項與常見陷阱,是一份相當完整的「如何讓代理做視覺專案」範例。
不適合的有三種。一是想直接用成品商用的人,原因是參考畫來源不明。二是想要一鍵產生任意風格山水的人,因為 Shanshui 是為這十幅畫手工調整的專案,不是通用工具。三是需要完整提示與成本紀錄的人,因為倉庫沒有提供。
動手前我會做三件事。先看發行頁的影片,確認風格是不是你要的。接著讀 STYLE.md 與 FILM.md,判斷哪些做法可以借用到自己的作品。最後在自己的環境跑 ?scene=s03 這類單幅預覽,確認顯示卡撐得住。
導入後的限制,也要提前知道。
限制與風險:說法與證據之間的落差
第一個限制是說法。貼文的「Opus 5.5 畫的」是作者自述,倉庫沒有模型資訊,提示、成本與人工介入程度都沒有公開。
第二個限制是參考畫。成品與參考畫的關係,倉庫文件已說明是逐區比對,但參考畫的來源與授權沒有交代,這是商業使用最大的不確定。
第三個限制是可攜性。即時預覽依賴 WebGL2 與顯示卡效能,輸出需要 Node、Chrome 與 ffmpeg,手機與低階筆電可能跑不動。
第四個限制是通用性。引擎與元素函式庫是為這十幅畫寫的,雖然模組化,但要畫新題材,仍要自己寫場景、做比對、反覆調整,沒有一鍵套用的樣板。
第五個限制是專案狀態。Shanshui 的倉庫在 10 月 19 日建立,我查詢時只有三個發行版本,後續維護與授權補充都還不確定。
Shanshui 常見問題
Shanshui 的程式碼可以商用嗎?
倉庫是 MIT 授權,程式碼可以使用與修改。但影片成品與十幅畫的構圖依據來源不明,要商用影片或畫面,建議先問作者並確認參考畫的權利。
貼文說的約 2.2 萬行 JavaScript 是真的嗎?
我用 wc -l 數過倉庫目前的檔案,src 約 24,000 行,扣掉實驗用的 lab 約 22,600 行,與貼文的數字同一量級。算法不同會有差異,行數也不代表品質。
一定要用 Opus 5.5 才能做出同樣的專案嗎?
倉庫沒有指定模型,文件只是寫給程式代理的操作說明。其他能讀圖、能執行指令的代理理論上都能照文件工作,但效果我沒有驗證。
為什麼打開網頁沒有聲音?
因為聲音需要先執行 node tools/audio.mjs 產生 soundtrack.wav,再按 M 鍵。倉庫不含已生成的音檔。
這是不是 AI 生成圖片?
不是。作者說所有畫面都是 WebGL2 著色器與 Canvas2D 筆觸在執行時算出來的,倉庫的程式碼也沒有載入圖片模型或圖片檔。AI 的角色,是貼文所稱的寫程式與調整。
先看成品,再讀文件,最後才決定能不能借用
Shanshui 把水墨畫、動態與配樂全部寫成程式,文件也詳細到可以當作代理協作的教材,我認為這是它最值得讀的地方。它最有價值的是方法,不是那十張畫面本身。
想借用的人,從 STYLE.md 與引擎文件開始最有效。想把成品放進商業作品的人,請先確認參考畫來源,再決定怎麼用。若想持續追蹤創意編程與生成式藝術的新作,可以免費訂閱 AI 郵報。