通过SurfaceTexture在GLSurfaceView上显示相机stream

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

我从这篇文章中获得灵感。

图像是完整的,但没有正确显示在我的平板电脑上。 屏幕似乎分成2个部分。 图像显示在左上部分,而其他三个部分是黑色的。

我怀疑这个问题来自于我使用这里logging的顺序返回的变换matrix

updateTexImage(); getTransformMatrix(...); 

我在顶点着色器中传输这个matrix来生成片段着色器的纹理坐标。

顶点着色器:

 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 

};

Solutions Collecting From Web of "通过SurfaceTexture在GLSurfaceView上显示相机stream"

我已经成功地使用SurfaceTexture在自定义opengl纹理上绘制相机框架,而不使用android提供的转换matrix。

只要试着定义你的索引顶点和纹理,就像你做普通的纹理绘制一样。 像这样的例子。

 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投影,这是一个很好的post,关于如何生成一个合适的MVPmatrix。 你可以使用它来与顶点着色器中的位置相乘。

既然我有同样的问题,即使这个问题已经有点老了,但可能还是值得去详细阐述一下“为什么要使用变换matrix”

变换Matrix将SurfaceTexture使用的特定坐标集( 或者更有可能的情况下, 通过当前的video源stream 渲染到SurfaceTexture中映射到标准的OpenGL纹理坐标。

应该明确使用它的原因是,虽然Startibartfast答案在一个或多个特定的设置中起作用,并且可能很容易并且很容易实现, 但是当相同的程序在不同的设备上运行时可能会产生奇怪的可视化错误 ,这取决于实例对video驱动程序执行每个平台。

就我而言,例如,转换matrix只是颠倒内容(我使用SurfaceTexture与Nexus 7上的MediaPlayer一起使用),而不是Fabien R.指出的结果。

2012年11月3日的Fabien R编辑中指出了使用matrix的正确方法,我用一些小的修饰(如st索引的使用)和int / float不匹配的小修改来进行报告:

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

希望能帮助到你