8

OpenGL ES 2.0 シェーダーに送信された SurfaceTexture を介して GLSurfaceView にカメラ ストリームを表示しようとしています。

この投稿からインスピレーションを得ました。

画像は完成しましたが、タブレットに正しく表示されません。画面が 2x2 に分割されているように見えます。画像は左上の部分に表示され、残りの 3 つの部分は黒です。

問題は、ここに記載されているシーケンスによって返される変換行列の使用に起因すると思われます

updateTexImage();
getTransformMatrix(...);

このマトリックスを頂点シェーダーに送信して、フラグメント シェーダーのテクスチャ座標を生成します。

頂点シェーダー:

attribute vec3 aPosition;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;

void main(void)
{
  gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
  vec4 l_tex =  uTexMatTransform*vec4(aPosition.xyz, 1);
  vTexCoord=l_tex.xy;
}

フラグメント シェーダー:

#extension GL_OES_EGL_image_external : require
varying mediump vec2 vTexCoord;
uniform samplerExternalOES uSampler; 

void main(void) 
{ 
    mediump vec4 l_tex = texture2D(uSampler, vTexCoord);
    gl_FragColor=l_tex;
}

テクスチャは次の正方形に取り付けられます。

 // Image container
 GLfloat l_vertices[] = {
  -1.0f, 1.0f,  0.0f,
  -1.0f, -1.0f,  0.0f,
  1.0f,  -1.0f,  0.0f,
  1.0f,  1.0f,  0.0f };

誰かが似たようなことを達成しましたか?

2012 年 11 月 3 日編集:

頂点シェーダーの修正:

attribute vec3 aPosition;
attribute vec2 aTexCoord;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;

void main(void)
{
  gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
  vec4 l_tex =  uTexMatTransform*vec4(aTexCoord.xy,0, 1);
  vTexCoord=l_tex.xy;
}

と:

// Texture
GLfloat l_texCoord[] = {
   0.0f, 1.0f,
   0.0f, 0.0f,
   1.0f,  0.0f,
   1.0f,  1.0f

};

4

2 に答える 2

4

Android が提供する変換マトリックスを使用せずに、SurfaceTexture を使用してカスタム OpenGL テクスチャにカメラ フレームを描画することに成功しました。

通常のテクスチャ描画の場合と同様に、インデックスの頂点とテクスチャを定義してみてください。例えばこんな感じ。

const GLfloat Vertices[] = {0.5, -0.5, 0,
                            0.5, 0.5, 0,
                           -0.5, 0.5, 0,
                           -0.5, -0.5, 0};

const GLubyte Indices[] = { 0, 1, 2,
                            2, 3, 0 };

const GLfloat Textures[] = { 1.,0.,
                             0.,0.,
                             0.,1.,
                             1.,1. };

通常のテクスチャを使用する方法で、表面テクスチャを使用できるはずです。

ある種の 3D プロジェクションを実行したい場合、これは適切な MVP マトリックスを生成する方法に関する良い投稿です。これを使用して、頂点シェーダーの位置を乗算できます。

于 2012-11-03T03:46:18.773 に答える