Exibindo o fluxo da câmera em um GLSurfaceView via SurfaceTexture
Estou tentando exibir o fluxo da câmera em um GLSurfaceView por meio de um SurfaceTexture transmitido para os shaders do OpenGL ES 2.0.
Eu tomei inspiração dissopostar.
A imagem está completa, mas não é exibida corretamente no meu tablet. A tela parece dividida em 2x2 partes. A imagem é exibida na parte superior esquerda, enquanto as outras três partes são pretas.
Eu suspeito que o problema vem do meu uso da matriz de transformação retornada pela seqüência documentadaAqui
updateTexImage();
getTransformMatrix(...);
Eu transmito esta matriz no shader de vértice para gerar as coordenadas de textura para o shader de fragmento.
shader de vértice:
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;
}
shader de fragmento:
#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;
}
A textura é anexada ao seguinte quadrado:
// 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 };
Alguém conseguiu algo parecido?
Editado em 3 de novembro de 2012:
Correção do shader de vértice:
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;
}
com:
// Texture
GLfloat l_texCoord[] = {
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f
};