通过SurfaceTexture在GLSurfaceView上显示相机流

Fab*_*n R 7 android opengl-es android-camera

我试图通过传递给OpenGL ES 2.0着色器的SurfaceTexture在GLSurfaceView中显示相机流.

我从这篇文章中汲取灵感.

图像已完成但未在我的平板电脑上正确显示.屏幕分为2x2部分.图像显示在左上部分,而其他三个部分显示为黑色.

我怀疑问题来自于我使用此处记录的序列返回的转换矩阵

updateTexImage();
getTransformMatrix(...);
Run Code Online (Sandbox Code Playgroud)

我在顶点着色器中传输此矩阵以生成片段着色器的纹理坐标.

顶点着色器:

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;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#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;
}
Run Code Online (Sandbox Code Playgroud)

纹理附加到以下方块:

 // 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 };
Run Code Online (Sandbox Code Playgroud)

有没有人有类似的东西?

编辑于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;
}
Run Code Online (Sandbox Code Playgroud)

有:

// Texture
GLfloat l_texCoord[] = {
   0.0f, 1.0f,
   0.0f, 0.0f,
   1.0f,  0.0f,
   1.0f,  1.0f
Run Code Online (Sandbox Code Playgroud)

};

小智 4

我已成功使用 SurfaceTexture 在自定义 opengl 纹理上绘制相机帧,而无需使用 android 提供的转换矩阵。

只需尝试按照正常纹理绘制的方式定义索引顶点和纹理即可。比如像这样。

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. };
Run Code Online (Sandbox Code Playgroud)

您应该能够像使用普通纹理一样使用表面纹理。

如果您想要执行某种 3D 投影,这是一篇关于如何生成正确的 MVP 矩阵的好文章。您可以使用它与顶点着色器中的位置相乘。