用來接收 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 中,讓工程師能用程式設計來做內容控制,有效的做到專業分工。工程師不想碰美術,藝術家也不想碰程式!