VRChat
やぎり水産やぎり水産

座標、姿勢をRenderTextureに書込、読込機構

【概要】 ・オブジェクトの座標、姿勢をRenderTextureに書き込み、他のシェーダーからテクスチャ経由で読み込める機構です。 ・一台のカメラで複数のオブジェクトの情報が取得可能です。 ・本機構はphiさんのブログ記事(http://phi16.hatenablog.com/)を元に作りました。ありがとうございます。 ・詳しくは中に色々コメントを書いているので解析するか、上記のブログを読むことをオススメします。 ・(2枚目のスクショの数字表示シェーダーはわかりやすいように表示しているだけで同梱されません) 【使い方】 1. カメラレイヤーの設定 カメラにマーカーのみが映ってほしいので、MarkerCameraのCulling Maskの設定を行います。 通常のレイヤーのオブジェクトは映ってほしくなく、reserved2, 3, 4レイヤーは正常に動作しないので、自分でレイヤーを作ってMarkerCameraにそのレイヤーのみが映るよう設定してください。 また、マーカーはもとの状態だとY座標が0以下のカメラに入力する(張り付く)ようになっていますので、MarkerCameraのy座標は0以下になるようにしてください。 2. Marker配置 座標と姿勢を取得したいオブジェクトの子にMarkerを置きます。MarkerはサンプルシーンのMarker00などをコピーするなどして用意してください。 (MarkerのScaleを(1,1,1)以外にした時は姿勢行列部をシェーダー内で正規化してください) 3. 各マーカーのマテリアル設定 各マーカーに情報を入力したい番号(_Num)が設定されたマテリアルを設定します。 同じ番号には複数の情報を入力できないので、一つのマーカーに対して一つのマテリアルが必要です。 _Num=0~63のMarkerマテリアルは、MarkerMaterialsフォルダ内に作っておいたのでどうぞお使いください。 4. 各マーカーのレイヤー設定 各マーカーオブジェクトのLayerをMarkerCameraで設定したレイヤーに設定します。 5. データ読み込み マーカーの位置、姿勢を読み込みたいシェーダー内で、RenderTextureを参照し、データに対応した位置から_Num番目のデータを読み込みます。 サンプルのDebugShowCoordAsRGB.shaderと、DebugMakeRedQuadGS.shader内でマーカーの位置、姿勢を読み込む関数があるので、コピペするか参考にしてください。 フラグメントシェーダー内で読み込む版とそれ以外の場所で読み込む版があります。 【処理の順序】 1. Markerオブジェクトのレンダリングが行われます。MarkerマテリアルはMarkerCameraに貼りつき、情報を入力します。MarkerCameraの描画結果がMarkerRenderTargetに出力されます。 ex) _Num=0のMarkerマテリアルは(0, 0)~(0, 15)の16ピクセル、 _Num=1のMarkerマテリアルは(0, 16)~(0, 31)の16ピクセル…に情報を書き込みます。 2. MarkerRenderTargetから番号を指定して情報を読み取り、座標や姿勢を得ます。 【サンプル解説】 ・PickupableCube 1. 子オブジェクトのMarker00が、RenderTextureの_Num=0に対応する場所に座標・姿勢を書き込みます。 2. DebugShowCoordAsRGB(Marker00)で_Num=0の情報を読み取り、座標をRGBとして表示します。 ・PickapableCubeWithRedQuad 1. 子オブジェクトのMarker01が、RenderTextureの_Num=1に対応する場所に座標・姿勢を書き込みます。 2. DebugMakeRedQuadGS(Marker01)のシェーダー内でRenderTextureの_Num=1に対応する場所の情報を読み取り、Marker01の座標を取得し、その座標の少しずれたところに赤いQuadを生成します。

【概要】 ・オブジェクトの座標、姿勢をRenderTextureに書き込み、他のシェーダーからテクスチャ経由で読み込める機構です。 ・一台のカメラで複数のオブジェクトの情報が取得可能です。 ・本機構はphiさんのブログ記事(http://phi16.hatenablog.com/)を元に作りました。ありがとうございます。 ・詳しくは中に色々コメントを書いているので解析するか、上記のブログを読むことをオススメします。 ・(2枚目のスクショの数字表示シェーダーはわかりやすいように表示しているだけで同梱されません) 【使い方】 1. カメラレイヤーの設定 カメラにマーカーのみが映ってほしいので、MarkerCameraのCulling Maskの設定を行います。 通常のレイヤーのオブジェクトは映ってほしくなく、reserved2, 3, 4レイヤーは正常に動作しないので、自分でレイヤーを作ってMarkerCameraにそのレイヤーのみが映るよう設定してください。 また、マーカーはもとの状態だとY座標が0以下のカメラに入力する(張り付く)ようになっていますので、MarkerCameraのy座標は0以下になるようにしてください。 2. Marker配置 座標と姿勢を取得したいオブジェクトの子にMarkerを置きます。MarkerはサンプルシーンのMarker00などをコピーするなどして用意してください。 (MarkerのScaleを(1,1,1)以外にした時は姿勢行列部をシェーダー内で正規化してください) 3. 各マーカーのマテリアル設定 各マーカーに情報を入力したい番号(_Num)が設定されたマテリアルを設定します。 同じ番号には複数の情報を入力できないので、一つのマーカーに対して一つのマテリアルが必要です。 _Num=0~63のMarkerマテリアルは、MarkerMaterialsフォルダ内に作っておいたのでどうぞお使いください。 4. 各マーカーのレイヤー設定 各マーカーオブジェクトのLayerをMarkerCameraで設定したレイヤーに設定します。 5. データ読み込み マーカーの位置、姿勢を読み込みたいシェーダー内で、RenderTextureを参照し、データに対応した位置から_Num番目のデータを読み込みます。 サンプルのDebugShowCoordAsRGB.shaderと、DebugMakeRedQuadGS.shader内でマーカーの位置、姿勢を読み込む関数があるので、コピペするか参考にしてください。 フラグメントシェーダー内で読み込む版とそれ以外の場所で読み込む版があります。 【処理の順序】 1. Markerオブジェクトのレンダリングが行われます。MarkerマテリアルはMarkerCameraに貼りつき、情報を入力します。MarkerCameraの描画結果がMarkerRenderTargetに出力されます。 ex) _Num=0のMarkerマテリアルは(0, 0)~(0, 15)の16ピクセル、 _Num=1のMarkerマテリアルは(0, 16)~(0, 31)の16ピクセル…に情報を書き込みます。 2. MarkerRenderTargetから番号を指定して情報を読み取り、座標や姿勢を得ます。 【サンプル解説】 ・PickupableCube 1. 子オブジェクトのMarker00が、RenderTextureの_Num=0に対応する場所に座標・姿勢を書き込みます。 2. DebugShowCoordAsRGB(Marker00)で_Num=0の情報を読み取り、座標をRGBとして表示します。 ・PickapableCubeWithRedQuad 1. 子オブジェクトのMarker01が、RenderTextureの_Num=1に対応する場所に座標・姿勢を書き込みます。 2. DebugMakeRedQuadGS(Marker01)のシェーダー内でRenderTextureの_Num=1に対応する場所の情報を読み取り、Marker01の座標を取得し、その座標の少しずれたところに赤いQuadを生成します。