見出し画像

Sharing images btwn Unity & openframeworks via Syphon(KlakSyphon)

はじめに

Unityは3Dの作品づくりが得意なframeworkです。一方、
openframeworks(oF)は、2Dが得意と言えます。作品により、これらを使い分けると便利ですが、一歩踏み込んで、oFで複雑な2D imageをつくり、これをUnityに送ってDynamic textureとして使用すると、作品のQualityがupします。

今回は、これを実現するためのtipsです。

環境

* MacBook Pro(Retina, 15-inch Mid 2015)
* openframeworks v0.9.0
* Unity2018.2.2f1
* XCode v7.2

準備

今回は、KeijiroさんのKlakSyphonを使います。clone or downloadしてください。Unityで新規Projectを作成したら、上記Assetをimportします。

Steps for server(Unity send image to oF)

Klak/Syphon/Runtime から、SyphonServerをMain Cameraにattachする
なんと、Unity側はこれだけです。
oF側では、ofxSyphonを使ってReceiveします。

この時、 

client_direct.set("xxx","xxx"); // void set(string _serverName, string _appName);

において、

_serverName = "Main Camera"(Object Name)
_appName    = UnityのPlayerSetting/ ProductNameで指定された"Name" (not app name.)
              or
              "Unity"(when simulation on Unity Editor)

になりますので、ご注意ください。

Steps for client(Unity receives image from oF)

* 空のオブジェクトを作成("SyphonReceiver"とする)
* Project windowから、RenderTextureを作成しておく("tx_Syphon"とする)
* SyphonReceiverにKlak/Syphon/Runtime から、SyphonClientをattach
* inspectorで、AppName = oFのApp name
* inspectorで、Server Name = ofxSyphonServer::setName("xxx"); で指定した"name".
* inspectorで、TargetTextureに、"tx_Syphon"をset.
* 必要に応じてtextureのWrap modeはRepeatなどに設定.


この時、RenderTextureの設定で、Anti-aliasingをNoneにしていると、materialでtilingをしても、textureが繰り返されなかった(WrapMode == Repeatにしても)ので、注意です。

画像1

これで、"tx_Syphon"にimageが送られてくるので、このRenderTextureを使い、新規のmaterialを作成して、これに反映する。albedoの他, Height mapなどにも適用できるので、細かい表現が可能になります。また、SyphonReceiverに複数のSyphonClientをattachすれば、複数のSyphon imageを受け取ることができます。一つのObject(SyphonReceiver)で全てのimageを受けて、それぞれRenderTextureに反映し、これらを使って複数のmaterialを作成することもできます。

ちなみに、inspector上の、TargetRendererは、ブランクでOK.
∵TargetTextureの方が柔軟な使い方ができるため。

もし、これを使いたい場合は、TargetTextureをブランクにした上で、 Hierarchy上のObjectをsetします。すると、同Objectにattachされたmaterial/shaderに従い、「そのshaderの、どのparameterにsyphon textureを送るか」が選択可能なDropDownListが表示されますので、適宜、指定して使用してください。この時、同Objectにattachするmaterialは、Defaultでなく別途、準備すること。そうしないと、"Default material"がattachされた全てのObjectに、Syphonが適用されてしまいます。

注意

oFでAlpha付きのimageをつくり、syphonでunityに送りたい時、

fbo.allocate(UI_WIDTH, UI_HEIGHT, GL_RGBA);

とfboをAlpha付きにすること。
unity側では、materialのAlbedo、Emission Color(光らせたい場合) の双方にsyphon textureを適用すること。

Emissionのみだと、Alphaで抜くことができないので注意。

Source Code

Unityと通信する、oFのsourceなどは、GitHubにupしてあります。

参考文献/ URL

* KlakSyphon
* Unityと通信する、oF側のsourceなど


もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。