android - 通过 SurfaceTexture 在 GLSurfaceView 上显示相机流

标签 android opengl-es android-camera

我正在尝试通过传输到 OpenGL ES 2.0 着色器的 SurfaceTexture 在 GLSurfaceView 中显示相机流。

我从这个 post 中得到灵感.

图像是完整的,但在我的平板电脑上显示不正确。 屏幕似乎分为 2x2 部分。图片显示在左上角,其他三部分为黑色。

我怀疑问题出在我对 here 记录的序列返回的转换矩阵的使用上

updateTexImage();
getTransformMatrix(...);

我在顶点着色器中传输这个矩阵以生成 fragment 着色器的纹理坐标。

顶点着色器:

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;
}

fragment 着色器:

#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

};

最佳答案

我已成功使用 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. };

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

如果您想执行某种 3D 投影,这是一个 good post关于如何生成合适的 MVP 矩阵。您可以使用它与顶点着色器中的位置相乘。

关于android - 通过 SurfaceTexture 在 GLSurfaceView 上显示相机流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13200652/

相关文章:

android - 当用户在 Android 上按下主页按钮时无法继续录制视频

android - 将整个 Textview 旋转 -90 度

java - 连接到 Android 时是否必须为每个 CRUD 方法创建单独的 php 文件?

java - 如何从 Android studio 打开相关应用程序中的社交媒体链接?

javascript - 模拟 Android 浏览器中触摸事件的悬停行为

ios - iOS 中的 Sampler3D

android - 是否有比使用 AndroidBitmap_xxx 函数更快的视频渲染解决方案?

opengl - EGL和OpenGL有什么关系?

android - 在 onPreviewFrame() 中重新添加回调缓冲区时相机预览变慢

android - 无法同时从 onPreviewFrame 回调中录制视频和取帧