React Native, ExpoでカメラビューのOpenGL処理


一月ほど前に失敗した「React Native (Expo)でカメラプレビューにエフェクト」のリベンジです。

React Native(Expo managed)の環境で、カメラのプレビュー画面を入力としてOpenGLで編集して表示する方法を見つけたので書いておきます。

問題のおさらい

前回の内容での問題はカメラプレビューをgl-react<Node/>texture2Dとして渡せないため、連続して画像保存して渡すことにしたが使い物にならないことでした。

今回は直接渡す方法が見つかったので、これを使って解決します。

救世主 webgltexture-loader

https://github.com/gre/webgltexture-loader

これはWebGLTextureのロードとキャッシュに関するライブラリです。

gl-reactのように環境ごとにパッケージがわかれているので、今回実際に使うのはwebgltexture-loader-expo-cameraです。

importするだけでOKです。

ちなみにこれなしで<Node>にカメラを渡そうとすると次のエラーになります。

Node#1(ShaderName#2), uniform t: no loader found for value, Camera {...

簡単な使い方の説明

とりあえずCameraを使うための基本設定と<Surface>を定義しておきます。

 

続いて肝心のNodeの設定です。

まずwebgltexture-loaderのおかげでt: () => cameraRef.currentが可能に。

 

requestAnimationFramecancelAnimationFrameでアニメーション管理。

ただloopRefは再描画の対象にならないため前にやったforceUpdateを使っています。

 

これで処理可能なフレームごとに描画が行われることになります。

 

ついでに今回使ったシェーダーはこちら。

x=0.5で反転する鏡処理です(x, yの反転が煩雑なのは座標系の問題)。

これでリアルタイムOpenGL処理ができるようになりました。


コメントを残す

メールアドレスが公開されることはありません。