>我从Grafika的例子开始,我想用GlRenderView渲染相机预览。我的问题是如何修改从表面纹理获得的变换矩阵,以便像使用设备前置摄像头一样镜像视频预览:
mDisplaySurface.makeCurrent();
mCameraTexture.updateTexImage();
mCameraTexture.getTransformMatrix(mTmpMatrix);
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
我尝试了以下行,但我的视频得到了奇怪的效果:应用水平翻转。
// Apply horizontal flip.
android.opengl.Matrix.scaleM(mTmpMatrix, 0, -1, 1, 1);
谢谢大家。
我也遇到过这个问题,奇怪的是,每次我调用 drawFrame 函数两次时,第一次都是正确的,第二次是颠倒的,如下所示:
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(mTmpMatrix);
mDisplaySurface.makeCurrent();
GLES20.glViewport(0, 0, mSurfaceView.getWidth(), mSurfaceView.getHeight());
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);//draws in correct direction
mDisplaySurface.swapBuffers();
mOffscreenSurface.makeCurrent();
GLES20.glViewport(0, 0, desiredSize.getWidth(), desiredSize.getHeight());
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);//draws upside down
mOffscreenSurface.getPixels();
很好奇为什么会发生这种情况.....
无论如何,解决方案很简单,只需在 FullFrameRect 类中添加一个 drawFrameFilpped 函数并调用它来绘制翻转的图像:
public void drawFrameFlipped(int textureId, float[] texMatrix) {
float[] mMatrix=GlUtil.IDENTITY_MATRIX.clone();//must clone a new one...
Matrix m=new Matrix();
m.setValues(mMatrix);
m.postScale(1,-1);
m.getValues(mMatrix);
//note: the mMatrix is how gl will transform the scene, and
//texMatrix is how the texture to be drawn onto transforms, as @fadden has mentioned
mProgram.draw(mMatrix, mRectDrawable.getVertexArray(), 0,
mRectDrawable.getVertexCount(), mRectDrawable.getCoordsPerVertex(),
mRectDrawable.getVertexStride(),
texMatrix, mRectDrawable.getTexCoordArray(), textureId,
mRectDrawable.getTexCoordStride());
}
并致电
mFullFrameBlit.drawFrameFlipped(mTextureId, mTmpMatrix);