通过SurfaceTexture在GlsurFaceView上显示相机流



我正在尝试通过向OpenGl ES 2.0着色器的SurfaceTexture在Glsurfaceview中显示相机流。

我从这篇文章中汲取了灵感。

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

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

updateTexImage();
getTransformMatrix(...);

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

顶点着色器:

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

with:

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

您应该能够以使用普通纹理的方式使用surfaceTexture。

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

因为我遇到了相同的问题,即使问题有些旧,也值得详细说明"为什么使用转换矩阵"

转换矩阵映射SurfaceTexture使用的特定坐标集(或更可能,由当前视频源流式传输到surfaceTexture ... 到标准的OpenGL纹理坐标。

应该肯定使用它的原因是,尽管startibartfast答案在一个或多个特定的设置中起作用,并且可能很容易实现,但是当同一程序运行时,它可能会产生奇怪的可视化错误不同的设备,取决于每个平台的视频驱动程序实现。

例如,例如,转换矩阵只是将内容倒置翻转(我使用surfaceTexture与Nexus 7上的媒体播放器一起使用),而不是Fabien r。

指出的结果。

使用矩阵的正确方法在2012年11月3日在 fabien r编辑中指出,我用一些小点缀(例如使用ST索引的使用)进行报告,int/float不匹配:

attribute   vec2 uv;
varying     vec2 vTexCoord;
uniform     mat4 transformMatrix;
vTexCoord = (transformMatrix * vec4(uv, 0.0, 1.0)).st;

希望它有帮助

最新更新