13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SurfaceTextureのClass Overviewを日本語訳してみました。

OpenGL ESテクスチャーとしてのイメージストリームからのキャプチャーフレームです。

イメージストリームはカメラプレビューやビデオデコードから来ます。SurfaceTextureから作られたSurfaceandroid.hardware.camera2, MediaCodec, MediaPlayer, Allocation等のAPIからの出力先として使用することができます。
updateTexImage()が呼ばれると、SurfaceTextureを作成するときに指定されたテクスチャーの内容がイメージストリームからの最新の画像に更新されます。これによりいくつかのフレームがスキップされることがあります。

SurfaceTextureは古いCamera APIでのSurfaceHolderとして使うこともできます。こうすることでデバイスのディスプレイの代わりに全てのイメージストリームがSurfaceTextureに送られるようになります。

テクスチャーからのサンプリングをする場合は、まずテクスチャー座標を変換するための行列をgetTransformMatrix(float[])で取得します。変換行列はupdateTexImage()が呼ばれるたびに変化するので、テクスチャーイメージが更新される度に再取得されるべきです。この行列は伝統的な2D OpenGL ESテクスチャー座標ベクトルを変換します。ベクトルは(s, t, 0, 1)の形式でstは0以上、1以下で、サンプリング位置を表します。この変換によって異なるソースのイメージストリームを統一的に扱えるようになります。たとえば、画像の左下の隅は変換行列によってベクトル(0, 0, 0, 1)になり、画像の右上の隅はベクトル(1, 1, 0, 1)になります。

テクスチャーオブジェクトはGL_TEXTURE_EXTERNAL_OESテクスチャーターゲットを使用します。これはGL_OES_EGL_image_external OpenGL ES 拡張で定義されています。これはテクスチャーがどのように使われるかを制限します。テクスチャーはGL_TEXTURE_2DではなくGL_TEXTURE_EXTERNAL_OESターゲットにバウンドされなければいけません。さらに、このテクスチャーからサンプリングを行う全てのOpenGL ES 2.0シェーダーはこの拡張を使用する宣言を行う必要があります。たとえば、"#extension GL_OES_EGL_image_external : require"ディレクティブです。このようなシェーダーはsamplerExternalOESGLSLサンプラータイプを使ってテクスチャーにアクセスする必要があります。

SurfaceTextureオブジェクトはどんなスレッドでも作成することができます。updateTexImage()はテクスチャーオブジェクトを持つOpenGL ESコンテキストのスレッドからしか呼べません。フレーム利用可能コールバックは任意のスレッドから呼ばれるので、updateTexImage()はこのコールバックから直接呼ばれるべきではありません。


…うーん、わかったようなわからないような…

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?