[Unity 6 教學] Spout 跑不動,試著用 NDI 實作 TouchDesigner 影像雙向傳輸

2024.12.02 / Unity 引擎
KlakSpout 目前無法在新版 Unity 上運作,我們可以改用 KlakNDI 來取代 Syphon/Spout 的影像傳輸功能,是一種犧牲效能來換取相容性的作法。

用來接收 TouchDesigner 影像的 KlakSpout 在 Unity 2022 版本後會出現「d3d11: failed to create 2D texture shader resource view id=xxxx」錯誤,無法正常運作。為了滿足開發需求,我們可以改用「NDI」作為替代方案,NDI 是透過網路來傳輸影像,因此與 Syphon/Spout 相比會吃比較多的效能且有少許延遲,但相容性絕佳。

KlakSpout 的開發者 Keijiro 也有開發一套讓 Unity 使用 NDI 接收 TouchDesigner 的套件「KlakNDI」,KlakNDI 的使用方式與 KlakSpout 相似,很好上手,是目前我愛用的方案。

新增套件來源

Keijiro 開發的套件都放在 npmjs.com 平台上,因此我們需要先從 Project Settings > Package Manager 中新增指定的套件來源,分別填入以下內容:

  • Name:Keijiro
  • URL:https://registry.npmjs.com
  • Scope(s):jp.keijiro

完成後要點擊 Apply 讓設定生效。

安裝 KlakNDI

開啟 Package Manager,切換到 My Registries > Keijiro,找到並安裝 KlakNDI 套件。

新增 NDI Out 節點

在 TouchDesigner 中新增一個 NDI Out TOP,並給他一個視訊輸入。我們用一個方形的動態影像作為範例,目標要把他傳輸到 Unity 中。

NDI Out 的 Source Name 屬性不能重複,如果有多種影像輸出時要注意一下。

接收 NDI 影像

在 Unity 中新增一個 Render Texture,解析度設定成和預計要輸入的尺寸相同,再到場景上新增 Raw Image 來顯示 Render Texture 畫面。

最後還要在 Raw Image 上加上 Ndi Receiver 元件,並將 Render Texture 拖曳到 Target Texture 上,即可接收傳來的影像。

我們也可以繞過 Render Texture,將輸入的影像直接丟給 Mesh Renderer 來當成貼圖,把要用的 Mesh Renderer 拖曳到 Ndi Receiver 的 Target Renderer,指定要塞入的屬性 (例如:_BaseMap),即可成功渲染。

藝術家可以利用 TouchDesigner 的視覺化語言的優勢來創作影像效果,再將影像傳輸到 Unity 中,讓工程師能用程式設計來做內容控制,有效的做到專業分工。工程師不想碰美術,藝術家也不想碰程式!

相關文章

Ted Liou

雲科碩士在讀中,專注於 Unity C#、TouchDesigner 技術,常把技術筆記分享到部落格,偶爾還直接挪用文章來當教材的研究生。