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にしても)ので、注意です。
これで、"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としての活動費に充てさせて頂きます。